Angle detection is realized based on MFC and OpenCV

  • 2020-06-15 09:54:34
  • OfStack

Examples of this paper share the specific code of MFC and OpenCV for your reference, the specific content is as follows


//  Corner detection  
//  According to the OpenCV Implementation of Computer Vision Technology 
 
#define max_corners 200;     //  The maximum number of Angle points you can limit 
 
IplImage* srcImage = 0;     //  Source image to be processed 
IplImage* ImageShow = 0;     //  Store and display images with angular points 
IplImage* grayImage = 0;     //  A grey scale image converted from an original image 
IplImage* corners1 = 0;     //  Temporary image 
IplImage* corners2 = 0;     //  Temporary image 
 
int cornerCount0 = max_corners;
int cornerCount;       //  Angle points actually measured 
int qualityLevel = 0;      //  Minimum mass factor 
int minDistance = 15;      //  Minimum distance of corner point 
CvScalar color = CV_RGB(255,0,0);   //  The drawing color 
CvPoint2D32f corners[200];     //  Angular point coordinates 
CvRect ROI_rect;       //  Test range 
char chek_area_state = 0;     //  State of the mouse 
 
void re_find_corners(int)     //  The slider response function 
{
 int i,x,y,xl,yu,xr,yd,k;
 int radius = 5;
 int thickness = 1;
 double quality_level = (double) qualityLevel / 100 + 0.02;
 double min_distance = (double) minDistance;
 
 cornerCount=cornerCount0;    //  Sets the maximum number of Angle points 
 cvGoodFeaturesToTrack(grayImage,  //  Corner detection 
 corners1,corners2,corners,&cornerCount,
 quality_level,min_distance,NULL);
 
 if (cornerCount>0) {     //  To the corner 
 xl=ROI_rect.x;  yu=ROI_rect.y; //  Set the initial test scope 
 xr=ROI_rect.x+ROI_rect.width;
 yd=ROI_rect.y+ROI_rect.height;
 cvCopy(srcImage,ImageShow);   //  Restore source image 
 for (i=0,k=0;i<cornerCount;i++) {
 x=(int)corners[i].x;
 y=(int)corners[i].y;
 if ((xl<x)&&(x<xr)&&(yu<y)&&(y<yd)) { //  Scope of inspection 
 corners[k].x=corners[i].x; //  Save the corner of the range 
 corners[k].y=corners[i].y;
 k++;
 }
 }
 cornerCount=k;      //  Angle points in range 
 cvCopy(srcImage,ImageShow);
 for (i=0;i<cornerCount;i++) {
 x=(int)corners[i].x;
 y=(int)corners[i].y;
 cvCircle(ImageShow,cvPoint(x,y), //  Circle the corners 
 radius,color,thickness,CV_AA,0);
 }
 cvRectangle(ImageShow,cvPoint(xl,yu),cvPoint(xr,yd),
 CV_RGB(0,255,0),thickness,CV_AA,0); //  Draw a rectangular 
 cvShowImage("image", ImageShow); //  Display a circled image 
 }
}
 
void on_mouse2(int event,int x,int y,int flags,void* param)
{           //  Mouse response function 
 int thickness = 1;
 CvPoint point1,point2;
 
 if (event == CV_EVENT_LBUTTONDOWN) { //  Press the left mouse button 
 ROI_rect.x = x;      //  Record detection window 1 Angular coordinates 
 ROI_rect.y = y;
 chek_area_state = 1;    //  Set status flag 
 }
 else if (chek_area_state && event == CV_EVENT_MOUSEMOVE) { //  The mouse moves 
 cvCopy(srcImage,ImageShow);   //  Restore original image 
 point1 = cvPoint(ROI_rect.x, ROI_rect.y);
 point2 = cvPoint(x,y);    //  The current coordinates 
 cvRectangle(ImageShow,point1,point2,CV_RGB(0,255,0),
 thickness,CV_AA,0);   //  Draw a rectangular 
 cvShowImage("image", ImageShow); //  Display test results 
 cvWaitKey(20);      //  Time delay 
 }
 else if (chek_area_state && event == CV_EVENT_LBUTTONUP) { //  Raise the left mouse button 
 ROI_rect.width = abs(x - ROI_rect.x); //  Record the diagonal coordinates of the detection window 
 ROI_rect.height = abs(y - ROI_rect.y);
 
 re_find_corners(0);     //  Corner detection 
 chek_area_state = 0;    //  Recovery status flag 
 cvWaitKey(20); 
 }
}
 
void CCVMFCView::OnCornersTest()   //  Corner detection 
{
 if (workImg->nChannels>1) {    //  The original image is a true color image ==3
 srcImage = cvCloneImage(workImg);
 }
 else {         //  The original image is a grayscale image 
 srcImage = cvCreateImage(cvGetSize(workImg),IPL_DEPTH_8U,3);
 cvCvtColor(workImg,srcImage,CV_GRAY2BGR);
 }
 cvFlip(srcImage);
 
 grayImage = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U,1);
 cvCvtColor(srcImage,grayImage,CV_BGR2GRAY); //  Convert to grayscale image 
 ImageShow = cvCloneImage(srcImage);
 
 ROI_rect.x =0;
 ROI_rect.y =0;
 ROI_rect.width = grayImage->width;
 ROI_rect.height = grayImage->height;
 
 corners1 = cvCreateImage(cvGetSize(grayImage),IPL_DEPTH_32F,1);
 corners2 = cvCreateImage(cvGetSize(grayImage),IPL_DEPTH_32F,1);
 
 cvNamedWindow("image",0);    //  Set display window 
 cvResizeWindow("image",325,350);  //  Change window size 
 
 cvCreateTrackbar(" Minimum distance of corner point ", "image", //  Set the distance slider 
 &minDistance, 200,re_find_corners);
 cvCreateTrackbar(" Minimum mass factor ","image", //  Set the mass slider 
 &qualityLevel,100,re_find_corners);
 
 re_find_corners(0);      //  Corner detection 
 
 cvSetMouseCallback("image",on_mouse2,0); //  Set the mouse response function 
 
 cvWaitKey(0);       //  Wait for key input 
 
 cvDestroyWindow( "image" );    //  Close the window 
 
 cvReleaseImage(&srcImage);    //  Release the image storage unit 
 cvReleaseImage(&grayImage);
 cvReleaseImage(&corners1);
 cvReleaseImage(&corners2);
 
 cvFlip(ImageShow);
 m_dibFlag=imageReplace(ImageShow,&workImg); //  Output test result 
 
 m_ImageType=-2;
 Invalidate();
}


Related articles: