在MFC中建立一个对话框的工程test2来显示图像聚类的图像,在工程中建立一个Myclass类,其中聚类算法two_meansCluster(IplImage *image)是类中的一个成员函数代码如下:IplImage* Myclass::two_meansCluster(IplImage *image)
{              IplImage* img=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,0);
cvCvtColor(image,img,CV_BGR2GRAY);//MFC中显示OPENCV的图片都要对其进行灰度变换后再彩色变换回来,故用一个img来过渡
CvMat* mat=cvCreateMat(img->height,img->width,CV_32FC1);//用于将原图像转换成矩阵,便于处理
cvZero(mat);
cvConvert(img,mat);//将图像转换为矩阵

int m=img->height*img->width;
CvMat pointshdr,*points=cvReshape(mat,&pointshdr,1,m);//创建一个一维矩阵或数组
CvMat* clusters=cvCreateMat(m,1,CV_32SC1);

cvKMeans2(points,2,clusters,cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,10,1.0));
CvMat dsthdr,*dst=cvReshape(clusters,&dsthdr,1,img->height); 
IplImage* img1=cvCloneImage(img);
cvConvert(dst,img1);
cvCvtColor(img1,image,CV_GRAY2BGR);//彩色变换回来 cvReleaseMat(&mat);
cvReleaseImage(&img);
cvReleaseImage(&img1);
//将mat_2反色
   return image;
}
在test3Dlg.cpp中显示图片,图片显示函数为void CTest2Dlg::ShowImage(IplImage* img,UINT ID)
{
// 获得显示控件的 DC
CDC* pDC = GetDlgItem( ID ) ->GetDC();
// 获取 HDC(设备句柄) 来进行绘图操作
HDC hDC = pDC ->GetSafeHdc();

CRect rect;
GetDlgItem(ID) ->GetClientRect( &rect );
// 求出图片控件的宽和高
int rw = rect.right - rect.left;
int rh = rect.bottom - rect.top;
// 读取图片的宽和高
int iw = img->width;
int ih = img->height;
// 使图片的显示位置正好在控件的正中
int tx = (int)(rw - iw)/2;
int ty = (int)(rh - ih)/2;
SetRect( rect, tx, ty, tx+iw, ty+ih );
// 复制图片
CvvImage cimg;
cimg.CopyOf( img );
// 将图片绘制到显示控件的指定区域内
cimg.DrawToHDC( hDC, &rect );

ReleaseDC( pDC );
}
给对话框加上一个按钮,按钮命令函数是void CTest2Dlg::OnCluster() 
{
// TODO: Add your control notification handler code here Myclass clustering;
clustering.two_meansCluster(TheImage);
ShowImage(TheImage,IDC_show);//IDC_show是显示图片的ID号

}
结果显示的图片显示不出来(显示出来全黑,因为背景是全黑的)。请问各位,这问题出在哪???

解决方案 »

  1.   

    你确定通过图片ID来获取dc的方式是没错的么,要不就是DrawToHDC里面的问题
      

  2.   

    确定是正确的,之前有用过同样的方法来获取图片,能显示。DrawToHDC里面的问题,能更明确点吗?
      

  3.   

    void CTest2Dlg::ShowImage(IplImage* img,UINT ID)
    {
    //把图片转换格式(由CImage类自己完成)
    m_Image.CopyOf(img); 
    //获得控件dc
    HDC dc = GetDlgItem(IDC_STATIC_PICTURE)->GetDC()->m_hDC;
    //得到控件的大小
    CRect r;
        GetDlgItem(ID)->GetClientRect(r);
    //显示图片
    m_Image.DrawToHDC(dc,r);
    }其他的代码删了吧(包含函数IplImage* Myclass::two_meansCluster(IplImage *image))。如果还不行的话。加我QQ:1547502596。把工程发过来我帮你看看