void CCVMFC0View::OnCannyBorddetec() // Canny 边缘检测 { // 根据《学习OpenCV》例 2-6 改编 // 定义工作位图 IplImage* pImage; IplImage* pImg8u = NULL; IplImage* pImg8uSmooth = NULL; IplImage* pImgCanny = NULL; //** 输入待处理图像 ** // 修改部分 1 pImage = workImg; // 建立辅助位图 pImg8u =cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1); pImg8uSmooth=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1); pImgCanny =cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1); // 图像处理 cvCvtColor(pImage, pImg8u,CV_BGR2GRAY); cvSmooth(pImg8u, pImg8uSmooth,CV_GAUSSIAN,3,0,0); cvCanny(pImg8uSmooth, pImgCanny,100,200,3); // 释放位图 cvReleaseImage(&pImg8u); cvReleaseImage(&pImg8uSmooth); //** 输出处理结果 ** // 修改部分 2 m_dibFlag = ImageReplace(pImgCanny, &workImg); //** 设置标志及刷新窗口 ** m_ImageType=1; Invalidate(); }
形参书写顺序
演示程序CVMFC是Windows API系统与OpenCV两种体系函数的混合使用,而它们的函数参数的书写习惯是不同的,极容易引起混淆。这里作一简要说明,请看下面例子:
目标参数Dest <-- 源参数Src
C: memcpy( pDest, pSrc, size); Windows API: BitBlt( hDestDC, 0, 0, wid, hei, hSrcDC, 0, 0, SRCCOPY); VC++: pDestDC->BitBlt( 0, 0, p->wid, p->hei, pSrcDC, 0, 0, SRCCOPY);
源参数Src --> 目标参数Dest
OpenCV: cvCvtColor( pSrcImg, pDestcImg, CV_BGR2GRAY); cvSmooth( pSrcImg, pDestcImg, CV_GAUSSIAN, 3, 0, 0);
演示程序中除了OpenCV函数采用后一书写形式外,其他函数都采用前一书写形式,千万注意不能混淆。OpenCV函数很容易辨认,都以前缀cv-开头,如cvCvtColor、cvSmooth。新增函数ImageClone与imageReplace因为调用OpenCV函数,故也采用后一书写形式。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30453-5.html
戒骄戒躁