[learning opencv]第十章:精确检测角点函数cvFindCornerSubPix的demo

cvFindCornerSubPix利用cvGoodFeaturesToTrack检测出来的角点的基础上,能够将角点位置精确到亚像素级精度。

cvGoodFeaturesToTrack的使用可以参考这里

//cvFindCornersSubPix_demo.cpp
//http://blog.csdn.net/moc062066
//2011.07.26

#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>


#pragma comment(lib, "opencv_core220d.lib")
#pragma comment(lib, "opencv_highgui220d.lib")
#pragma comment(lib, "opencv_imgproc220d.lib")



int main(int argc, char** argv)
{
	FILE* fp = fopen("d:\\result.txt","w+" ) ;
	const char* filename = "D:\\mochen_WIN32\\opencv\\CH10\\one_way_train_0001.jpg" ;
	//const char* windowname = "http://blog.csdn.net/moc062066" ;

	//img AND img_copy is the same,use to draw different result 
	IplImage* img = cvLoadImage(filename,CV_LOAD_IMAGE_COLOR );
	IplImage* img_copy = cvCloneImage( img ) ;//a copy of img
	IplImage* img_gray = cvCreateImage(cvGetSize( img ),IPL_DEPTH_8U, 1) ;
	IplImage* eig_image = cvCreateImage(cvGetSize( img ),IPL_DEPTH_32F, 1);
	IplImage* temp_image = cvCloneImage( eig_image ) ;

	cvCvtColor(img,img_gray,CV_BGR2GRAY);

	const int MAX_CORNERS = 1000 ;
	CvPoint2D32f* corners = new CvPoint2D32f[ MAX_CORNERS ];
	int corner_count = MAX_CORNERS;
	double quality_level = 0.1; //OR 0.01
	double min_distance = 5;

	cvGoodFeaturesToTrack(
		img_gray,
		eig_image,         
		temp_image,
		corners,
		&corner_count,
		quality_level,
		min_distance
	);

	//draw corners from cvGoodFeaturesToTrack on "img"
	for (int i = 0 ; i < corner_count ; ++i){
		cvLine( 
			img,
			cvPoint(corners[i].x,corners[i].y) ,
			cvPoint(corners[i].x,corners[i].y),
			CV_RGB(255,0,0),
			5
		);
		fprintf(fp,"\t%f\t%f\n",corners[i].x,corners[i].y) ;
	}
	
	fprintf(fp,"\n\n\n\n\n") ;

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

	cvFindCornerSubPix(
		img_gray,
		corners,
		corner_count,
		cvSize(half_win_size,half_win_size),
		cvSize(-1,-1),//no ignoring the neighbours of the center corner
		cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,iteration,epislon)
		);

	//draw subpix corners on "img_copy"
	for (int i=0;i<corner_count;i++){
		cvLine( 
			img_copy,
			cvPoint(corners[i].x,corners[i].y) ,
			cvPoint(corners[i].x,corner
  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值