歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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. }  
Copyright © Linux教程網 All Rights Reserved