您的位置:首页 > Web前端

【练习8.7】cvGoodFeaturesToTrack确定图像强角点、cvFindCornerSubPix亚像素级角点检测

2015-05-20 21:18 621 查看
页内索引

题目要求程序代码结果图片要言妙道借鉴参考
题目要求:

黑色背景上创建一个白色拐角,使得这个角正好在整数值的坐标上,保存用OpenCV打开

a、找出并输出拐角的确切坐标

分别改变原始图像进行如下操作

b、用白边透明填充的圆将圆角遮住

c、用白边黑色填充的圆将圆角遮住

d、用黑色圆块将圆角遮住

程序代码:

// OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点。
//
//    string file_full_name = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseImage\\第8章\\r20.jpg";

#include "stdafx.h"
#include<string>
#include <cv.h>
#include <highgui.h>
#include <iostream>
#include<math.h>

#include <opencv2/legacy/legacy.hpp>
//#pragma comment(lib, "opencv_legacy2411.lib")

using namespace cv;
using namespace std;

//函数声明-->--->-->--->-->--->-->--->//

//<--<--<--<--<--<--<--<--<--函数声明//

int _tmain(int argc, _TCHAR* argv[])
{
string file_full_name = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseImage\\第8章\\拐角.jpg";

IplImage * image_source = cvLoadImage(file_full_name.c_str(), CV_LOAD_IMAGE_GRAYSCALE);
CV_Assert(image_source);

string file_full_name_2 = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseImage\\第8章\\拐角2.jpg";

IplImage * image_source_2 = cvLoadImage(file_full_name_2.c_str(), CV_LOAD_IMAGE_GRAYSCALE);
CV_Assert(image_source_2);

IplImage * images[2] = { image_source, image_source_2 };

string window_name = "角度图像";
for (int i = 0; i < 2; ++i)
{
window_name = window_name + "。";
IplImage * image_gray = cvCloneImage(images[i]);
IplImage * image_eig = cvCreateImage(cvGetSize(images[i]), IPL_DEPTH_32F, 1);
cvZero(image_eig);
IplImage* image_temp = cvCloneImage(image_eig);

int corner_count = 5;
CvPoint2D32f *corners = new CvPoint2D32f[corner_count];

cvGoodFeaturesToTrack(image_gray, image_eig, image_temp, corners, &corner_count, 0.1, 10);

IplImage * image_corner = cvCloneImage(image_gray);
//cvZero(image_corner);
cout << "cvGoodFeaturesToTrack:" << endl;
for (int i = 0; i < corner_count; ++i)
{
cout << corners[i].x << "  " << corners[i].y << endl;
cvDrawCircle(image_corner, cvPoint(corners[i].x, corners[i].y), 5, cvScalar(255));
}

cvNamedWindow(window_name.c_str(), CV_WINDOW_AUTOSIZE);
cvShowImage(window_name.c_str(), image_corner);

int half_win_size = 3;//the window size will be 3+1+3=7
int iteration = 20;
double epislon = 0.1;

cvFindCornerSubPix(image_gray, corners, corner_count
, cvSize(half_win_size, half_win_size), cvSize(-1, -1)
, cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, iteration, epislon));

IplImage * image_subPix = cvCloneImage(image_gray);

cout << "cvFindCornerSubPix:" << endl;
for (int i = 0; i < corner_count; ++i)
{
cout << corners[i].x << "  " << corners[i].y << endl;
cvDrawCircle(image_subPix, cvPoint(corners[i].x, corners[i].y), 5, cvScalar(255));
}

window_name = window_name + "。";
cvShowImage(window_name.c_str(), image_subPix);

cvReleaseImage(&image_gray);
cvReleaseImage(&image_eig);
cvReleaseImage(&image_temp);
cvReleaseImage(&image_corner);
cvReleaseImage(&image_subPix);
}

cvWaitKey(0);

cvReleaseImage(&image_source);
cvReleaseImage(&image_source_2);
cvDestroyAllWindows();

return 0;
}


结果图片:













要言妙道:

借鉴参考:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: