用OpenCV将图像显示在MFC的窗口中

对于OpenCV2.3以上的版本来说没有CvvImage类,所以要自己在工程中添加这个类,这个类的头文件以及实现文件在网上都可以找到现成的。

添加好这个类之后,接下来就是怎么去显示这个图像了,首先需要一张图片,有两种方式,一种是通过摄像机获取,一种是直接在电脑文件中打开。

首先对于第一种从摄像机中获取图像,先要利用CvCapture* capture创建一个capture指针用来连接摄像机(这里都是假设已经配置好OpenCV);然后就是获取摄像机了:capture=cvCreateCameraCapture(0);得到摄像机之后,我们要从摄像机中抓拍图像,那么我们需要建立一个全局的IplImage*对象m_iImg,用来存储图像。然后将从摄像机中抓拍的图像存储到这个全局变量中,m_iImg=cvQueryFrame(capture);至此,我们已经从摄像机中得到我们想要的图像了,那么接下来就是怎么把它在MFC的对话框中显示的问题了。

在MFC中进行图形图像操作有一个基本的类CDC,这个类是从Windows中的DC类继承来的,这个类基本上把所有的绘图的功能全部包含进来了。因此我们首先需要创建一个CDC指针:CDC* pDC=GetDlgItem(ID)->GetDC();这样我们就得到了某个控件资源相对应的CDC设备描述表了,有了这个还不够,我们还需要获得一个HDC,这个是窗口DC:HDC hDC;   hDC=pDC->GetSafeHdc();这样利用这个hDC我们就可以进行绘图操作了。然而要把IplImage格式的图像显示到MFC的窗口中,还需要CvvImage类的一个转换。CvvImage cimg;      cimg.CopyOf(m_iImg);然后就可以用这个cimg把图像绘制到MFC窗口中了,GetDlgItem(ID)->GetClientRect(&rect);这是获取要绘制图像的位置信息,有了位置信息就知道要把图像绘制在哪个地方了:cimg.DrawToHDC(hDC,&rect);这样我们就把图像显示到指定的窗口位置了。记得绘制完之后要释放CDC:ReleaseDC(pDC);

第二种方式就是通过直接打开电脑中的图像文件获取图像。那么这种方式就设计到要在对话框中创建一个按钮,然后对这个按钮控件添加消息效用函数,在消息响应函数中,我们将其和一个打开文件对话框联系起来,那么首先需要设置一个过滤器,TCHAR szFilter[]=_T(“图片文件(*.jpg)|*.jpg|所有文件(*.*)|*.*||”);然后就要在消息响应函数中创建一个文件对话框对象:CFileDialog fileDlg(TRUE,_T(“jpg”),NULL,0,szFilter,this);有了这个之后,这个按钮就会打开一个文件对话框,我们一般打开文件对话框,从里面选一个文件,然后点打开其实是获取这个文件的路径信息,那么我们就需要建立一个变量来存储这个文件的路径信息,在MFC中有CString类型:CString strFilePath;然后去检测,如果选择了一个文件,并且点击文件对话框中的确定按钮,则将选中的文件的路径信息存储到刚刚建立的CString变量中,if(IDOK==fileDlg.DoModal()){strFilePath=fileDlg.GetPathName();

这个strFilePath变量中就存储了我们选择的文件的路径信息了。

但是因为这个我们得到的路径信息是CString类型的,这在OpenCV中我们通过图像路径信息载入图像一般都是通过char*类型的路径信息,那么我们怎么把CString类型的变量转换为我们所需要的char*类型呢?这里我们可以用到这样的一条语句: string file_name = CT2A((LPCTSTR)strFilePath);这样我们首先将CString类型转换为string类型的,然后将string转换为char*类型的就简单了:constcahr* path_name=file_name.c_str();这条语句直接就完成了从string类型到char*类型的转换了,那么接下来我们就可以把这个路径信息的图像载入一个IplImage对象中了,接下来的图像显示和上面的一样了。

发布了50 篇原创文章 · 获赞 86 · 访问量 20万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章