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