MFC+OpenCV实现角点检测


  1. //  角点检测    
  2. //  根据《基于OpenCV的计算机视觉技术实现》   
  3.   
  4. #define max_corners 200;                    //  限定的最大角点数   
  5.   
  6. IplImage* srcImage  = 0;                    //  待处理的源图像   
  7. IplImage* ImageShow = 0;                    //  存储显示带角点的图像   
  8. IplImage* grayImage = 0;                    //  原始图像转换成的灰阶图像   
  9. IplImage* corners1  = 0;                    //  临时图像   
  10. IplImage* corners2  = 0;                    //  临时图像   
  11.   
  12. int cornerCount0 = max_corners;  
  13. int cornerCount;                            //  实际测得角点数   
  14. int qualityLevel = 0;                       //  最小质量因子   
  15. int minDistance  = 15;                      //  角点最小距离   
  16. CvScalar color = CV_RGB(255,0,0);           //  绘图颜色   
  17. CvPoint2D32f corners[200];                  //  角点坐标   
  18. CvRect ROI_rect;                            //  测试范围   
  19. char   chek_area_state = 0;                 //  鼠标状态   
  20.   
  21. void re_find_corners(int)                   //  滑动条响应函数   
  22. {  
  23.     int   i,x,y,xl,yu,xr,yd,k;  
  24.     int   radius = 5;  
  25.     int   thickness = 1;  
  26.     double quality_level = (double) qualityLevel / 100 + 0.02;  
  27.     double min_distance  = (double) minDistance;  
  28.   
  29.     cornerCount=cornerCount0;               //  设置最大角点数   
  30.     cvGoodFeaturesToTrack(grayImage,        //  角点检测   
  31.         corners1,corners2,corners,&cornerCount,  
  32.         quality_level,min_distance,NULL);  
  33.   
  34.     if (cornerCount>0) {                    //  测到角点   
  35.         xl=ROI_rect.x;     yu=ROI_rect.y;   //  设置初始测试范围   
  36.         xr=ROI_rect.x+ROI_rect.width;  
  37.         yd=ROI_rect.y+ROI_rect.height;  
  38.         cvCopy(srcImage,ImageShow);         //  恢复源图像   
  39.         for (i=0,k=0;i<cornerCount;i++) {  
  40.             x=(int)corners[i].x;  
  41.             y=(int)corners[i].y;  
  42.             if ((xl<x)&&(x<xr)&&(yu<y)&&(y<yd)) {  //  范围检查   
  43.                 corners[k].x=corners[i].x;  //  保存范围内角点   
  44.                 corners[k].y=corners[i].y;  
  45.                 k++;  
  46.             }  
  47.         }  
  48.         cornerCount=k;                      //  范围内角点数   
  49.         cvCopy(srcImage,ImageShow);  
  50.         for (i=0;i<cornerCount;i++) {  
  51.             x=(int)corners[i].x;  
  52.             y=(int)corners[i].y;  
  53.             cvCircle(ImageShow,cvPoint(x,y),   //  角点处画圈   
  54.                 radius,color,thickness,CV_AA,0);  
  55.         }  
  56.         cvRectangle(ImageShow,cvPoint(xl,yu),cvPoint(xr,yd),  
  57.             CV_RGB(0,255,0),thickness,CV_AA,0);  //  画矩形   
  58.         cvShowImage("image", ImageShow);    //  显示画圈图像   
  59.     }  
  60. }  
  61.   
  62. void on_mouse2(int event,int x,int y,int flags,void* param)  
  63. {                                           //  鼠标响应函数   
  64.     int  thickness = 1;  
  65.     CvPoint point1,point2;  
  66.   
  67.     if (event == CV_EVENT_LBUTTONDOWN) {    //  鼠标左键按下   
  68.         ROI_rect.x = x;                     //  记录检测窗口一角坐标   
  69.         ROI_rect.y = y;  
  70.         chek_area_state = 1;                //  设置状态标志   
  71.     }  
  72.     else if (chek_area_state && event == CV_EVENT_MOUSEMOVE) {  //  鼠标移动   
  73.         cvCopy(srcImage,ImageShow);         //  恢复原始图像   
  74.         point1 = cvPoint(ROI_rect.x, ROI_rect.y);  
  75.         point2 = cvPoint(x,y);              //  当前坐标   
  76.         cvRectangle(ImageShow,point1,point2,CV_RGB(0,255,0),  
  77.             thickness,CV_AA,0);         //  画矩形   
  78.         cvShowImage("image", ImageShow);    //  显示检测结果   
  79.         cvWaitKey(20);                      //  延时   
  80.     }  
  81.     else if (chek_area_state && event == CV_EVENT_LBUTTONUP) {  //  鼠标左键抬起   
  82.         ROI_rect.width  = abs(x - ROI_rect.x);  //  记录检测窗口对角坐标   
  83.         ROI_rect.height = abs(y - ROI_rect.y);  
  84.   
  85.         re_find_corners(0);                 //  角点检测   
  86.         chek_area_state = 0;                //  恢复状态标志   
  87.         cvWaitKey(20);   
  88.     }  
  89. }  
  90.   
  91. void CCVMFCView::OnCornersTest()            //  角点检测   
  92. {  
  93.     if (workImg->nChannels>1) {             //  原图为真彩色图像==3   
  94.         srcImage = cvCloneImage(workImg);  
  95.     }  
  96.     else {                                  //  原图为灰阶图像   
  97.         srcImage = cvCreateImage(cvGetSize(workImg),IPL_DEPTH_8U,3);  
  98.         cvCvtColor(workImg,srcImage,CV_GRAY2BGR);  
  99.     }  
  100.     cvFlip(srcImage);  
  101.   
  102.     grayImage = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U,1);  
  103.     cvCvtColor(srcImage,grayImage,CV_BGR2GRAY);  //  转换为灰阶图像   
  104.     ImageShow = cvCloneImage(srcImage);  
  105.   
  106.     ROI_rect.x =0;  
  107.     ROI_rect.y =0;  
  108.     ROI_rect.width  = grayImage->width;  
  109.     ROI_rect.height = grayImage->height;  
  110.   
  111.     corners1 = cvCreateImage(cvGetSize(grayImage),IPL_DEPTH_32F,1);  
  112.     corners2 = cvCreateImage(cvGetSize(grayImage),IPL_DEPTH_32F,1);  
  113.   
  114.     cvNamedWindow("image",0);               //  设置显示窗口   
  115.     cvResizeWindow("image",325,350);        //  改变窗口尺寸   
  116.   
  117.     cvCreateTrackbar("角点最小距离""image",  //  设置距离滑动条   
  118.         &minDistance, 200,re_find_corners);  
  119.     cvCreateTrackbar("最小质量因子","image",  //  设置质量滑动条   
  120.         &qualityLevel,100,re_find_corners);  
  121.   
  122.     re_find_corners(0);                     //  角点检测   
  123.   
  124.     cvSetMouseCallback("image",on_mouse2,0);  //  设置鼠标响应函数   
  125.   
  126.     cvWaitKey(0);                           //  等待键输入   
  127.   
  128.     cvDestroyWindow( "image" );             //  关闭窗口   
  129.   
  130.     cvReleaseImage(&srcImage);              //  释放图像存储单元   
  131.     cvReleaseImage(&grayImage);  
  132.     cvReleaseImage(&corners1);  
  133.     cvReleaseImage(&corners2);  
  134.   
  135.     cvFlip(ImageShow);  
  136.     m_dibFlag=imageReplace(ImageShow,&workImg);  //  输出检测结果   
  137.   
  138.     m_ImageType=-2;  
  139.     Invalidate();  
  140. }  

相关内容