VS2010中应用OPENCV步骤
vs2010上配置opencv

图像增强和去雾说明文档文件夹说明:以下文件夹中的工程配置的opencv解压位置为F:\opencvXP系统下VS2010+Opencv-2.4.7的配置1.安装软件安装OpenCV-2.4.7,双击解压到F:\opencv(可设置任意路径,假设为%opencv%,本文中%opencv%代表opencv2.4.7解压路径的完整路径)。
安装VS2010,安装。
2.配置OpenCV环境变量计算机->(右键)属性->高级(标签)->环境变量->(双击)用户变量PATH->在变量值里面添加“%opencv%\build\x86\vc10\bin”,本机为“F:\opencv\build\x86\vc10\bin”。
3.启动VS2010,打开增强和去雾工程.sln文件。
若按步骤1、2中示例的路径正确配置,则可直接运行程序。
若opencv路径与步骤1、2中示例路径不同,按以下方法配置工程的opencv依赖。
4.配置工程的opencv依赖4.1视图(菜单项)->解决方案资源管理器->(右击)quwu_gpu->属性->配置属性->VC++目录:需要配置“包含目录”和“库目录”两项。
4.2配置“包含目录”项:添加行%opencv%\build\include%opencv%\build\include\opencv%opencv%\build\include\opencv24.3配置“库目录”项:添加行”%opencv%\build\x86\vc10\lib”即可。
4.4视图(菜单项)->解决方案资源管理器->(右击)quwu_gpu->属性->配置属性->连接器->输入->附加依赖项针对debug配置添加以下库:opencv_calib3d247d.lib opencv_contrib247d.lib opencv_core247d.lib opencv_features2d247d.lib opencv_flann247d.lib opencv_gpu247d.lib opencv_highgui247d.lib opencv_imgproc247d.lib opencv_legacy247d.lib opencv_ml247d.lib opencv_objdetect247d.lib opencv_ts247d.libopencv_video247d.lib。
OpenCV 2.4.4安装与配置

OpenCV 2.4.4 安装与配置步骤一:安装OpenCV/projects/opencvlibrary/files/opencv-win/2.4.4/1.从以上地址下载OpenCV2.4.4,执行exe文件,将文件安装到所需目录。
2.建立环境变量并添加到系统路径(以将文件安装在D:\opencv为例):i) 右键点击桌面的计算机图标,选择“属性”,跳出如下窗口:ii) 点击“高级系统设置”,跳出如下窗口:iii) 点击“高级”选项卡下的“环境变量”,跳出如下窗口:iv) 点击“系统变量”下的“新建”,“变量名”输入OPENCV_BUILD,“变量值”输入D:\opencv\build(如果OpenCV解压在别的目录,请输入该目录路径。
比如,如果在C盘ProgramFiles文件夹建立了名为OpenCV的文件夹,并在其中解压,那么输入的目录就为C:\ProgramFiles\OpenCV\opencv\build,总之目录一直到build文件夹),点击“确定”。
v) 双击“用户变量”中的PATH,在跳出的窗口中输入变量值为%OPENCV_BUILD%\x86\vc10\bin (如果电脑是64位系统的,请把“x86”改为“x64”;并请确保使用的是VS 2010,因为vc10文件夹针对的是VS 2010)。
步骤二:在VS2010中配置OpenCV1. 打开VS 2010,新建一个项目(Win32控制台或MFC 都可以)。
2. 建立Debug 属性表。
i) 点击“视图”菜单中的“属性管理器”。
ii) 右键“Debug|Win32”,选中“添加新项目属性表”。
iii) 输入名称为OpenCVProjectDebug。
iv) 建立后双击属性管理器中的OpenCVProjectDebug,对其进行编辑。
v) 选择“通用属性”下的“VC++目录”,点击“包含目录”,然后点下拉条,单击“<编辑…>”。
OPENCV 2.4.10安装

一、VS2020安装opencv2.4.101.1首先安装vs2010安装这个就不用多谈了1.2下载opencv-2.4.10.exe,并解压到最后会在1.3添加系统变量在系统变量path后添加:C:\opencv\opencv\build\x86\vc10\bin1.4新建vc++控制台工程项目,配置1.4.1项目属性->配置属性->VC++目录->包含目录添加C:\opencv\opencv\build\includeC:\opencv\opencv\build\include\opencvC:\opencv\opencv\build\include\opencv21.4.2项目属性->配置属性->VC++目录->引用目录添加C:\opencv\opencv\build\x86\vc10\lib1.4.3项目属性->链接器->输入->附加依赖项在debug模式下添加配置方案为Debug的配置,添加:(2410代表我的opencv版本是2.4.10,需要对应更改)opencv_calib3d2410d.libopencv_contrib2410d.libopencv_core2410d.libopencv_features2d2410d.libopencv_flann2410d.libopencv_gpu2410d.libopencv_highgui2410d.libopencv_imgproc2410d.libopencv_legacy2410d.libopencv_ml2410d.libopencv_nonfree2410d.libopencv_objdetect2410d.lib opencv_ocl2410d.libopencv_photo2410d.libopencv_stitching2410d.libopencv_superres2410d.libopencv_ts2410d.libopencv_video2410d.libopencv_videostab2410d.lib配置方案为Release的配置,添加:opencv_calib3d2410.libopencv_contrib2410.libopencv_core2410.libopencv_features2d2410.lib opencv_flann2410.libopencv_gpu2410.libopencv_highgui2410.libopencv_imgproc2410.libopencv_legacy2410.libopencv_ml2410.libopencv_nonfree2410.libopencv_objdetect2410.libopencv_ocl2410.libopencv_photo2410.libopencv_stitching2410.libopencv_superres2410.libopencv_ts2410.libopencv_video2410.libopencv_videostab2410.lib二、工程中新建一个CPP文件,#include<iostream>#include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>using namespace cv;int main(){Mat img=imread("d:\\aaa.bmp");//读入一张图片namedWindow("Test");//创建一个名为Test窗口imshow("Test",img);//窗口中显示图像waitKey(5000);//等待5000ms后窗口自动关闭}。
VS 2010在MFC中用opencv实现对视频中动态目标的追踪

Visual Studio2010在MFC中用opencv实现对视频中动态目标的追踪第二步,建立一个MFC的对话框程序,做两个按钮,一个“打开视频文件”,一个“运动跟踪处理”。
具体操作:1 建立MFC对话框程序的框架:File ->New -> MFC AppWizard(exe),选取工程路径,并取工程名“VideoProcesssing”-> Next -> 选择Dialog based后,去掉使用Unicode库的勾,选择在静态库中使用 MFC,点Finish,点OK.2 添加按钮:直接Delete掉界面默认的两个“确定”“取消”按钮。
然后添加两个button,分别名为“打开视频”,“运动跟踪处理”,其ID分别设为IDC_OPEN_VIDEO,IDC_TRACKING.3 添加消息响应函数:双击按钮“打开视频文件”,自动生成响应函数名OnOpenVideo,点Ok。
然后添加如下代码:CFileDialog dlg(true,"*.avi",NULL,NULL,"*.avi|*.avi||");if (dlg.DoModal()==IDOK){strAviFilePath = dlg.GetPathName();}else{return;}同样,双击“运动跟踪处理”按钮,选择默认的响应函数名,然后添加代码://声明IplImage指针IplImage* pFrame = NULL;IplImage* pFrImg = NULL;IplImage* pBkImg = NULL;CvMat* pFrameMat = NULL;CvMat* pFrMat = NULL;CvMat* pBkMat = NULL;CvCapture* pCapture = NULL;int nFrmNum = 0;//打开AVI视频文件if(strAviFilePath=="") //判断文件路径是否为空{MessageBox("请先选择AVI视频文件!");return;}else{if(!(pCapture = cvCaptureFromFile(strAviFilePath))) {MessageBox("打开AVI视频文件失败!");return;}}//创建窗口cvNamedWindow("Video", 1);cvNamedWindow("Background",1);cvNamedWindow("Foreground",1);//使窗口有序排列,窗口宽330cvMoveWindow("Video", 30, 0);cvMoveWindow("Background", 360, 0);cvMoveWindow("Foreground", 690, 0);//逐帧读取视频while(pFrame = cvQueryFrame( pCapture )){nFrmNum++;//如果是第一帧,需要申请内存,并初始化if(nFrmNum == 1){pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1); // 存放背景图像(灰度)pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1); // 存放中间图像(灰度)pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);//转化成单通道图像再处理(灰度)cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);cvConvert(pFrImg, pFrameMat);cvConvert(pFrImg, pFrMat);cvConvert(pFrImg, pBkMat);}else{cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); //转化成单通道图像再处理(灰度)cvConvert(pFrImg, pFrameMat);//高斯滤波先,以平滑图像//cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0);//当前帧跟背景图相减(求背景差并取绝对值)cvAbsDiff(pFrameMat, pBkMat, pFrMat);//二值化前景图(这里采用特定阈值进行二值化)cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);//进行形态学滤波,去掉噪音cvErode(pFrImg, pFrImg, 0, 1);cvDilate(pFrImg, pFrImg, 0, 1);//滑动平均更新背景(求平均)cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);//将背景转化为图像格式,用以显示cvConvert(pBkMat, pBkImg);// 保持原图像的旋转方向pBkImg->origin = pFrImg->origin = pFrame->origin;//显示图像cvShowImage("Video", pFrame);cvShowImage("Background", pBkImg);cvShowImage("Foreground", pFrImg);//如果有按键事件,则跳出循环//此等待也为cvShowImage函数提供时间完成显示//等待时间可以根据CPU速度调整if( cvWaitKey(200) >= 0 )break;}}//销毁窗口cvDestroyWindow("Video");cvDestroyWindow("Background");cvDestroyWindow("Foreground");//释放图像和矩阵cvReleaseImage(&pFrImg);cvReleaseImage(&pBkImg);cvReleaseMat(&pFrameMat);cvReleaseMat(&pFrMat);cvReleaseMat(&pBkMat);cvReleaseCapture(&pCapture);4 选fileview选项卡中VideoProcessingDlg.h,在CVideoProcessingDlg类中添加公有类成员:CString strAviFilePath;5 选fileview选项卡中VideoProcessingDlg.cpp,添加opencv头文件#include "cv.h"#include "highgui.h"#include "cxcore.h"6 编译执行,成功!还可以添加一个”录制视频”的按钮,修改ID号为IDC_RECORD,双击“录制视频”按钮,选择默认的响应函数名,然后添加代码:CvCapture* capture=cvCaptureFromCAM(-1); //打开摄像头CvVideoWriter* video=NULL;IplImage* frame=NULL;int n;if(!capture) //如果不能打开摄像头给出警告{cout<<"Can not open the camera."<<endl;return ;}else{frame=cvQueryFrame(capture); //首先取得摄像头中的一帧video=cvCreateVideoWriter("camera.avi", CV_FOURCC('X', 'V', 'I', 'D'), 25,cvSize(frame->width,frame->height)); //创建CvVideoWriter对象并分配空间//保存的文件名为camera.avi,编码要在运行程序时选择,大小就是摄像头视频的大小,帧频率是32if(video) //如果能创建CvVideoWriter对象则表明成功{cout<<"VideoWriter has created."<<endl;}cvNamedWindow("Camera Video",1); //新建一个窗口int i = 0;while(i <= 200) // 让它循环200次自动停止录取{frame=cvQueryFrame(capture); //从CvCapture中获得一帧if(!frame){cout<<"Can not get frame from the capture."<<endl;break;}n=cvWriteFrame(video,frame); //判断是否写入成功,如果返回的是1,表示写入成功cout<<n<<endl;cvShowImage("Camera Video",frame); //显示视频内容的图片i++;if(cvWaitKey(2)>0)break; //有其他键盘响应,则退出}cvReleaseVideoWriter(&video);cvReleaseCapture(&capture);cvDestroyWindow("Camera Video");}return ;第二步,建立一个编程环境,然后加载opencv的库路径等等。
vs2010与opencv配置过程

Vs2010与Opencv 配置过程一.我的opencv是安装在D盘的以下内容是按照D盘安装的步骤:1 设置环境变量:我的电脑--->右键--->属性--->高级--->环境变量--->在用户变量里,(系统环境变量和用户环境变量里面都要添加这两个位置)新建PATH和TBB两个项步骤1:在PATH中添加D:\vs2010\opencv\build\x86\vc10\bin,步骤2:添加TBB的环境变量D:\vs2010\opencv\build\common\tbb\ia32\vc10如图所示:2.步骤3 打开一个Opencv的工程,点菜单目录的“视图”--->属性管理器--->双击项目名称步骤3:在配置属性—>通用属性--->VC++目录--->包含目录文件中添加D:\vs2010\opencv \build\includeD:\vs2010\opencv \build\include\opencvD:\vs2010\opencv \build\include\opencv23::在配置属性页—>通用属性--->VC++目录--->库目录中添加:D:\vs2010\opencv \build\x86\vc10\lib如图所示:步骤5 添加lib库文件, 在配置debug里--->项目属性--->链接器--->输入--->附加依赖库里加上opencv_core242d.libopencv_highgui242d.libopencv_video242d.libopencv_ml242d.libopencv_legacy242d.libopencv_imgproc242d.lib步骤6:在配置release里--->项目属性--->链接器--->输入--->附加依赖库里加上opencv_core242.libopencv_highgui242.libopencv_video242.libopencv_ml242.libopencv_legacy242.libopencv_imgproc242.lib测试小代码如下://在(show_image)窗口下读取图片(名为opencv)// opencv2_4_2test.cpp : 定义控制台应用程序的入口点。
vs2010+MFC+OpenCV实现Canny边缘检测

本文是基于工程文件中已经添加了OpenCv库和路径1、在工程中添加CvvImage.h和CvvImage.cpp(从网上下载);2、在Doc.h文件中添加头文件#include <highgui.h>和#include "CvvImage.h" 以及成员变量(以m_Image为例);在Doc.cpp中,利用MFC向导添加两个virual function:@1 OnOpenDocument() : 在该函数内添加m_Image.Load(lpszPathName);若参数不匹配,修改字符集,使用Multi-byte@2 OnSaveDocument() : 在该函数内添加CFileDialog dlg ( TRUE ) ;if ( dlg.DoModal() == IDOK ){m_image.Save(dlg.GetPathName());} //return TRUE;注释掉//return CDocument::OnSaveDocument(lpszPathName);3、在View.cpp中添加CvvImage.h在OnDraw中添加CvvImage &img=pDoc->m_image;CRect r;GetClientRect (&r);img.DrawToHDC(pDC->GetSafeHdc() ,r);至此,可以在MFC中通过OpenCv打开和保存图像了下面是一个例子:添加一个Canny边缘检测的方法1、在资源菜单上添加菜单按键,右键添加句柄Event Handler (Class List选择Doc)2、在第一部中自动生成的处理处理函数内,添加IplImage* img;img=m_Image.GetImage();if(img->nChannels==3){IplImage* dst = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);cvCvtColor(img,dst,CV_BGR2GRAY);*img=*dst;}cvCanny(img,img,50,150,3);UpdateAllViews(NULL);这样就能使用菜单对图像进行边缘检测了。
opencv2.3.1在vs2010上的配置
VS2010旗舰版下安装opencv2.3.1一、下载OpenC V for Windows(也即OpenCV-2.3.1-win-superpack.exe 文件)。
二、将OpenCV-2.3.1-win-superpack.exe解压到某个文件目录下(本文以D:\opencv2.3.1)为例三、安装CMake(不打算自己编译无需安装)下载cmake cmake-2.8.7-win32-x86.exe。
安装cmake到目录D:\ OpenCV2.3.1\cmake cmake-2.8.7-win32-x86运行cmake-gui,设置where is the source code路径为opencv安装路径(本文设置为:D:\ opencv2.3.1\opencv),设置where to build the binaries为D:\ opencv2.3.1\opencv\binary然后点Configure,会询问D:\ opencv2.3.1\opencv\binary文件夹不存在,是否创建?自然选择Yes.选择编译器,自然选择VS2010 (这里显示的是Visual Studio 10)点Finish,CMake会做一些测试,我们等待就行了,一般不会有问题。
测试结束,一些设置已经获得:这个时候设置还是红色的,再次点击Configure,确定。
这时红色的部分消失,可以看到一些路径已经设置:.点击左下方的Generate按钮,生成VS2010的项目文件。
这是我们查看硬盘D:\ opencv2.3.1 \binary文件夹,发现很多文件已经创建好了:可以看到.sln, .project配置文件均已经OK.找到OpenCV.sln文件,直接双击,用VS2010打开整个工程。
Build Solution, 分别编译Debug版和Release版:前窗口如下:此时直接编译(生成—>生成解决方案F7),这个过程会持续几分钟:然后把Debug下拉选择Release,如下图,再次编译(生成—>生成解决方案F7),同样会持续几分钟。
Opencv安装与配置(xp+vs2010+opencv2.4.9)
Opencv安装与配置(xp+vs2010+opencv2.4.9)工具:VS2010Opencv2.4.9WinXP步骤:1. 下载软件下载OpenCV-2.4.9,是个自解压文件,大小350MB左右。
双击解压到%opencv%(凡是出现%opencv%的地方均替换为你自己opencv 的路径全名,如D:\program\opencv)。
2. 配置opencv的环境变量OpenCV库函数需要通过用户环境变量调用所需要的库文件。
点击:开始->计算机(右击)->属性->高级系统设置->高级->环境变量,在用户变量里增加一项:变量名:path变量值:%opencv%\opencv\build\x86\vc10\bin如果已经有path项,在其变量值结尾添加英文分号“;”,再加上上面那个值。
这里的“x86”代表目标程序是32位的,如果要写64位的程序则选择“x64”文件夹。
并不是根据开发环境(你的机器)选择的。
后面的“vc10”代表使用Visual C++ 2010开发。
如果使用Visual Studio 2012,则填写“E:\softwares\opencv\build\x86\vc11\bin”。
OpenCV2.4.9已经为Visual Studio编译器预先配置好了动态库和静态库,因此不需要cmake再次进行编译。
1. 32位系统 & VC2010,库目录: %OpenCV%\build\x86\vc10\lib2. 64位系统 & VC2010,库目为:%OpenCV%\build\x64\vc10\lib因为2.4.9版本的opencv内嵌了TBB的功能,所以取消了TBB直接安装,这样就不需要再配置TBB环境变量了。
以上步骤完成后重启电脑使配置的环境变量生效。
3. 工程配置1) 创建一个空的Win32控制台程序opencvtest2) 配置include打开 项目---属性。
matlab调用opencv函数的配置
1、首先保证vs2010能正确调用opencv函数,2、Matlab中选择编译器,操作如下:打开matlab2012,输入mex –setup,出现如下提示:Welcome to mex -setup. This utility will help you set upa default compiler. For a list of supported compilers, see/support/compilers/R2012a/win32.htmlPlease choose your compiler for building MEX-files:Would you like mex to locate installed compilers [y]/n?输入y,出现如下提示:Select a compiler:[1] Lcc-win32 C 2.4.1 in C:\PROGRA~1\MATLAB\R2012a\sys\lcc[2] Microsoft Visual C++ 2010 in C:\Program Files\Microsoft Visual Studio 2010 [0] NoneCompiler:输入2,出现如下提示:Please verify your choices:Compiler: Microsoft Visual C++ 2010Location: C:\Program Files\Microsoft Visual Studio 2010Are these correct [y]/n?输入y出现如下提示,表明成功:********************************************************************* ******Warning: MEX-files generated using Microsoft Visual C++ 2010 require that Microsoft Visual Studio 2010 run-time libraries beavailable on the computer they are run on.If you plan to redistribute your MEX-files to other MATLABusers, be sure that they have the run-time libraries.********************************************************************* ******Trying to update options file: C:\Documents and Settings\zhangjing\Application Data\MathWorks\MATLAB\R2012a\mexopts.batFromtemplate: C:\PROGRA~1\MATLAB\R2012a\bin\win32\mexopts\msvc100opts .batDone . . .********************************************************************* *****Warning: The MATLAB C and Fortran API has changed to support MATLAB variables with more than 2^32-1 elements. In the near futureyou will be required to update your code to utilize the newAPI. You can find more information about this at:/help/techdoc/matlab_external/bsflnue-1.html Building with the -largeArrayDims option enables the new API.********************************************************************* *****3、配置一些目录在matlab中,输入mex –v下面会有显示:-> Default options filename found in C:\Documents andSettings\zhangjing\Application Data\MathWorks\MATLAB\R2012a-----------------------------> Options file = C:\Documents and Settings\zhangjing\ApplicationData\MathWorks\MATLAB\R2012a\mexopts.batMATLAB = C:\PROGRA~1\MATLAB\R2012A-> COMPILER = cl-> Compiler flags:COMPFLAGS = /c /GR /W3 /EHs /D_CRT_SECURE_NO_DEPRECATE/D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /nologo /MDOPTIMFLAGS = /O2 /Oy- /DNDEBUGDEBUGFLAGS = /Z7arguments =Name switch = /Fo。
VS2010+OpenCV2.4.9 双目摄像头捕获并存储
#include"cv.h"#include"cxcore.h"#include"highgui.h"#include<iostream>using namespace std;int main(){CvCapture* capture1=cvCaptureFromCAM(0);CvCapture* capture2=cvCaptureFromCAM(1);CvVideoWriter* video1=NULL;CvVideoWriter* video2=NULL;IplImage* frame1=NULL;IplImage* frame2=NULL;int m, n;if((!capture1)||(!capture1)) //如果不能打开摄像头则给出警告{cout<<"Can not open the camera."<<endl;return -1;}else{frame1=cvQueryFrame(capture1); //首先取得摄像头的一帧frame2=cvQueryFrame(capture2);video1=cvCreateVideoWriter("camera1.avi", CV_FOURCC('X', 'V', 'I', 'D'), 25, cvSize(frame1->width,frame1->height));video2=cvCreateVideoWriter("camera2.avi", CV_FOURCC('X', 'V', 'I', 'D'), 25, cvSize(frame2->width,frame2->height)); //创建CvVideoWriter对象并分配存储空间if(video1&&video2) // {cout<<"VideoWriter has created."<<endl;}cvNamedWindow("Camera1 Video",1);cvNamedWindow("Camera2 Video",1);while(1){frame1=cvQueryFrame(capture1);frame2=cvQueryFrame(capture2);if((!frame1) || (!frame2)){cout<<"Can not get frame from the capture."<<endl;break;}m=cvWriteFrame(video1,frame1);n=cvWriteFrame(video2,frame2);cout<<m<<endl;cout<<n<<endl;cvShowImage("Camera1 Video",frame1);cvShowImage("Camera2 Video",frame2);if(cvWaitKey(2)>0)break;}cvReleaseVideoWriter(&video1);cvReleaseVideoWriter(&video2);cvReleaseImage(&frame1);cvReleaseImage(&frame2);cvReleaseCapture(&capture1);cvReleaseCapture(&capture2);cvDestroyWindow("Camera1 Video");cvDestroyWindow("Camera2 Video");}return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VS2010的MFC中应用opencv步骤王良元2011.11.17如下步骤前提是VC6和Opencv均已正确安装,默认opencv是装在C:\Program Files下,后面路径都是这个,如果安装到其他位置,只要改为你安装路径即可。
1、打开VS2010,新建MFC工程,命名,此处为VS2010_OPENCV,如图1所示。
2、点击OK后,依次根据需要选择对应的形式,此处依次为基本对话框(Dialog based)、去掉UNICODE字符集选项,默认的、静态编译(As a statically linked library),完成,则弹出基本应用程序界面,如图2所示。
3、删除文本框“TODO:在这里设置对话框”,并添加一个图片控件,选中控件,右键-》属性,将“Type”选择为框架(rectangle),将ID改为IDC_ShowImg,适当调整控件大小,添加两个按钮,一个将caption改为ReadImg,实现读入图片功能,另一个将aption改为EdgeDetect,实现边缘检测功能,如图3所示。
4、在MFC工程中添加opencv的库和头文件,在VS2010中新建工程后,在工程名上右键-》属性-》配置属性-》VC++目录的右边分别添加包含目录和库目录,如下图所示具体添加内容为:头文件路径:C:\Program Files\OpenCV\cxcore\includeC:\Program Files\OpenCV\cv\includeC:\Program Files\OpenCV\cvaux\includeC:\Program Files\OpenCV\otherlibs\highguiC:\Program Files\OpenCV\otherlibs\cvcam\include库文件路径:C:\Program Files\OpenCV\lib5、在“解决方案管理器”面板点击头文件,在VS2010_OPENCVDlg.h 下加入如下代码:#include"cv.h"#include"highgui.h"#define IMAGE_WIDTH256#define IMAGE_HEIGHT256#define IMAGE_CHANNELS3然后,在stdafx.h的#include<afxcontrolbars.h>下面添加#pragma comment(lib,"C:\\Program Files\\OpenCV\\lib\\cv.lib")#pragma comment(lib,"C:\\Program Files\\OpenCV\\lib\\cvaux.lib")#pragma comment(lib,"C:\\Program Files\\OpenCV\\lib\\cxcore.lib")#pragma comment(lib,"C:\\Program Files\\OpenCV\\lib\\highgui.lib")在类视图面板右击VS2010_O pencv Dlg,右键添加-》添加变量,添加一个IplImage*类型的变量TheImage,如下图,再双击类视图下面的OnInitDialog,在“////TODO:在此添加额外的初始化代码“”下面添加TheImage的初始化代码:CvSize ImgSize;ImgSize.height=IMAGE_HEIGHT;ImgSize.width=IMAGE_WIDTH;TheImage=cvCreateImage(ImgSize,IPL_DEPTH_8U,IMAGE_CHANNELS);然后双击OnPaint,在if(IsIconic())…的else里添加以下代码,用来重绘窗口:CDialog::OnPaint();//重绘对话框CDialog::UpdateWindow();//更新windows窗口,如果无这步调用,图片显示还会出现问题ShowImage(TheImage,IDC_ShowImg);//重绘图片函数接着在CTest_OpencvApp下面的成员列表中双击InitInstance,在两个“//TODO: Place code here to handle when the dialog is…”下面添加:cvReleaseImage(&dlg.TheImage);即按下“OK”或“Cancel”时,释放TheImage占用的内存。
6、接下来就是写读取和处理图片的功能函数了。
在资源视图面板双击IDD_VS2010_OPENCV_DIALOG,弹出GUI编辑界面,双击按钮ReadImg,建立按钮点击的消息响应程序,方法为右键按-》添加信息处理事件,函数处理程序名称设置为OnBnClickedReadimg,进入代码编辑,主要的响应操作包括弹出对话框选择图片文件、读入图片文件、对图片统一缩放至256*256的大小、显示图像,代码如下://TODO:Add your control notification handler code hereCFileDialog dlg(TRUE,_T("*.bmp"),NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,_T("image files(*.bmp;*.jpg)|*.bmp;*.jpg|All Files(*.*)|*.*||"), NULL);//选项图片的约定dlg.m_ofn.lpstrTitle=_T("Open Image");//打开文件对话框的标题名if(dlg.DoModal()!=IDOK)//判断是否获得图片return;CString mPath=dlg.GetPathName();//获取图片路径IplImage*ipl=cvLoadImage(mPath,1);//读取图片、缓存到一个局部变量ipl中if(!ipl)//判断是否成功载入图片return;if(TheImage)//对上一幅显示的图片数据清零cvZero(TheImage);ResizeImage(ipl);//对读入的图片进行缩放,使其宽或高最大值者刚好等于256,再复制到TheImage中ShowImage(TheImage,IDC_ShowImg);//调用显示图片函数cvReleaseImage(&ipl);//释放ipl占用的内存其中包含了两个新的成员函数ResizeImage和ShowImage,前者的作用是对读入的不同大小的图像进行缩放,再通过设置ROI的方式将图像存入256*256的TheImage中;后者是将图像TheImage显示到图片显示控件IDC_ShowImg窗口的正中部位。
为了实现这两个功能,首先在类视图面板右击C VS2010_OPENCV Dlg,选择添加》添加函数,创建两个函数:void ResizeImage(IplImage*img)和voidShowImage(IplImage*img,UINT ID),记得参数写完一个一定要点击下面的添加按钮,在右边可以看到添加的参数,如下图。
以下是这两个函数的实现代码:void CTest_OpencvDlg::ResizeImage(IplImage*img){//读取图片的宽和高int w=img->width;int h=img->height;//找出宽和高中的较大值者int max=(w>h)?w:h;//计算将图片缩放到TheImage区域所需的比例因子float scale=(float)((float)max/256.0f);//缩放后图片的宽和高int nw=(int)(w/scale);int nh=(int)(h/scale);//为了将缩放后的图片存入TheImage的正中部位,需计算图片在TheImage左上角的期望坐标值int tlx=(nw>nh)?0:(int)(256-nw)/2;int tly=(nw>nh)?(int)(256-nh)/2:0;//设置TheImage的ROI区域,用来存入图片imgcvSetImageROI(TheImage,cvRect(tlx,tly,nw,nh));//对图片img进行缩放,并存入到TheImage中cvResize(img,TheImage);//重置TheImage的ROI准备读入下一幅图片cvResetImageROI(TheImage);}void CTest_OpencvDlg::ShowImage(IplImage*img,UINT ID)//ID是Picture Control控件的ID号{CDC*pDC=GetDlgItem(ID)->GetDC();//获得显示控件的DCHDC hDC=pDC->GetSafeHdc();//获取HDC(设备句柄)来进行绘图操作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);}7、最后是要对读入的图像做简单的Canny边缘处理,右键EdgeDetect按钮,添加事件处理程序,将函数处理程序名称改为“OnBnClickedEdgedetect“,相应的响应代码如下:void CTest_OpencvDlg::OnBnClickedEdgedetect(){//TODO:Add your control notification handler code hereIplImage*gray=0,*edge=0;gray=cvCreateImage(cvSize(IMAGE_WIDTH,IMAGE_HEIGHT), IPL_DEPTH_8U,1);edge=cvCreateImage(cvSize(IMAGE_WIDTH,IMAGE_HEIGHT), IPL_DEPTH_8U,1);cvCvtColor(TheImage,gray,CV_BGR2GRAY);cvCanny(gray,edge,30,100,3);cvCvtColor(edge,TheImage,CV_GRAY2BGR);ShowImage(TheImage,IDC_ShowImg);//调用显示图片函数cvReleaseImage(&gray);cvReleaseImage(&edge);}7、最后,点击绿色三角形图标进行编译运行,可看到结果如下。