【练习8.7】cvGoodFeaturesToTrack确定图像强角点、cvFindCornerSubPix亚像素级角点检测
题目要求 | 程序代码 | 结果图片 | 要言妙道 | 借鉴参考 |
黑色背景上创建一个白色拐角,使得这个角正好在整数值的坐标上,保存用OpenCV打开
a、找出并输出拐角的确切坐标
分别改变原始图像进行如下操作
b、用白边透明填充的圆将圆角遮住
c、用白边黑色填充的圆将圆角遮住
d、用黑色圆块将圆角遮住
1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点。 2 // 3 // string file_full_name = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseImage\\第8章\\r20.jpg"; 4 5 6 #include "stdafx.h" 7 #include<string> 8 #include <cv.h> 9 #include <highgui.h> 10 #include <iostream> 11 #include<math.h> 12 13 #include <opencv2/legacy/legacy.hpp> 14 //#pragma comment(lib, "opencv_legacy2411.lib") 15 16 using namespace cv; 17 using namespace std; 18 19 //函数声明-->--->-->--->-->--->-->--->// 20 21 22 //<--<--<--<--<--<--<--<--<--函数声明// 23 24 int _tmain(int argc, _TCHAR* argv[]) 25 { 26 string file_full_name = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseImage\\第8章\\拐角.jpg"; 27 28 IplImage * image_source = cvLoadImage(file_full_name.c_str(), CV_LOAD_IMAGE_GRAYSCALE); 29 CV_Assert(image_source); 30 31 string file_full_name_2 = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseImage\\第8章\\拐角2.jpg"; 32 33 IplImage * image_source_2 = cvLoadImage(file_full_name_2.c_str(), CV_LOAD_IMAGE_GRAYSCALE); 34 CV_Assert(image_source_2); 35 36 IplImage * images[2] = { image_source, image_source_2 }; 37 38 string window_name = "角度图像"; 39 for (int i = 0; i < 2; ++i) 40 { 41 window_name = window_name + "。"; 42 IplImage * image_gray = cvCloneImage(images[i]); 43 IplImage * image_eig = cvCreateImage(cvGetSize(images[i]), IPL_DEPTH_32F, 1); 44 cvZero(image_eig); 45 IplImage* image_temp = cvCloneImage(image_eig); 46 47 int corner_count = 5; 48 CvPoint2D32f *corners = new CvPoint2D32f[corner_count]; 49 50 cvGoodFeaturesToTrack(image_gray, image_eig, image_temp, corners, &corner_count, 0.1, 10); 51 52 IplImage * image_corner = cvCloneImage(image_gray); 53 //cvZero(image_corner); 54 cout << "cvGoodFeaturesToTrack:" << endl; 55 for (int i = 0; i < corner_count; ++i) 56 { 57 cout << corners[i].x << " " << corners[i].y << endl; 58 cvDrawCircle(image_corner, cvPoint(corners[i].x, corners[i].y), 5, cvScalar(255)); 59 } 60 61 cvNamedWindow(window_name.c_str(), CV_WINDOW_AUTOSIZE); 62 cvShowImage(window_name.c_str(), image_corner); 63 64 int half_win_size = 3;//the window size will be 3+1+3=7 65 int iteration = 20; 66 double epislon = 0.1; 67 68 cvFindCornerSubPix(image_gray, corners, corner_count 69 , cvSize(half_win_size, half_win_size), cvSize(-1, -1) 70 , cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, iteration, epislon)); 71 72 IplImage * image_subPix = cvCloneImage(image_gray); 73 74 cout << "cvFindCornerSubPix:" << endl; 75 for (int i = 0; i < corner_count; ++i) 76 { 77 cout << corners[i].x << " " << corners[i].y << endl; 78 cvDrawCircle(image_subPix, cvPoint(corners[i].x, corners[i].y), 5, cvScalar(255)); 79 } 80 81 window_name = window_name + "。"; 82 cvShowImage(window_name.c_str(), image_subPix); 83 84 cvReleaseImage(&image_gray); 85 cvReleaseImage(&image_eig); 86 cvReleaseImage(&image_temp); 87 cvReleaseImage(&image_corner); 88 cvReleaseImage(&image_subPix); 89 } 90 91 cvWaitKey(0); 92 93 cvReleaseImage(&image_source); 94 cvReleaseImage(&image_source_2); 95 cvDestroyAllWindows(); 96 97 return 0; 98 }
‖==========钟于原创 乐于分享 宁静致远 毋忆典藏==========‖