C++

Angle detection is realized based on MFC and OpenCV


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();
}