角点检测,输出坐标

来源:互联网 发布:软件发展战略 编辑:程序博客网 时间:2024/03/29 19:58

来自毛星云:

//--------------------------------------【程序说明】-------------------------------------------//程序说明:《OpenCV3编程入门》OpenCV2版书本配套示例程序88//程序描述:亚像素级角点检测//开发测试所用操作系统: Windows 7 64bit//开发测试所用IDE版本:Visual Studio 2010//开发测试所用OpenCV版本:2.4.9 --------------------------------------------------//---------------------------------【头文件、命名空间包含部分】----------------------------//描述:包含程序所使用的头文件和命名空间//------------------------------------------------------------------------------------------------#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>using namespace cv;using namespace std;//-----------------------------------【宏定义部分】-------------------------------------------- //  描述:定义一些辅助宏 //----------------------------------------------------------------------------------------------#define WINDOW_NAME "【亚像素级角点检测】"        //为窗口标题定义的宏 //-----------------------------------【全局变量声明部分】--------------------------------------//          描述:全局变量声明//-----------------------------------------------------------------------------------------------Mat g_srcImage, g_grayImage;int g_maxCornerNumber = 33;int g_maxTrackbarNumber = 500;RNG g_rng(12345);//初始化随机数生成器//-----------------------------【on_GoodFeaturesToTrack( )函数】----------------------------//          描述:响应滑动条移动消息的回调函数//----------------------------------------------------------------------------------------------void on_GoodFeaturesToTrack( int, void* ){//【1】对变量小于等于1时的处理if( g_maxCornerNumber <= 1 ) { g_maxCornerNumber = 1; }//【2】Shi-Tomasi算法(goodFeaturesToTrack函数)的参数准备vector<Point2f> corners;double qualityLevel = 0.01;//角点检测可接受的最小特征值double minDistance = 10;//角点之间的最小距离int blockSize = 3;//计算导数自相关矩阵时指定的邻域范围double k = 0.04;//权重系数Mat copy = g_srcImage.clone();//复制源图像到一个临时变量中,作为感兴趣区域//【3】进行Shi-Tomasi角点检测goodFeaturesToTrack( g_grayImage,//输入图像corners,//检测到的角点的输出向量g_maxCornerNumber,//角点的最大数量qualityLevel,//角点检测可接受的最小特征值minDistance,//角点之间的最小距离Mat(),//感兴趣区域blockSize,//计算导数自相关矩阵时指定的邻域范围false,//不使用Harris角点检测k );//权重系数//【4】输出文字信息cout<<"\n\t>-------------此次检测到的角点数量为:"<<corners.size()<<endl;for(int i=0;i<corners.size();i++)cout<<"原始坐标"<<i<<"  ("<<corners[i].x<<","<<corners[i].y<<")"<<endl;//【5】绘制检测到的角点int r = 4;for( unsigned int i = 0; i < corners.size(); i++ ){ //以随机的颜色绘制出角点circle( copy, corners[i], r, Scalar(g_rng.uniform(0,255), g_rng.uniform(0,255),g_rng.uniform(0,255)), -1, 8, 0 ); }//【6】显示(更新)窗口imshow( WINDOW_NAME, copy );//【7】亚像素角点检测的参数设置Size winSize = Size( 5, 5 );Size zeroZone = Size( -1, -1 );TermCriteria criteria = TermCriteria( CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 40, 0.001 );//【8】计算出亚像素角点位置cornerSubPix( g_grayImage, corners, winSize, zeroZone, criteria );//【9】输出角点信息for( int i = 0; i < corners.size(); i++ ){ cout<<" \t>>精确角点坐标["<<i<<"]  ("<<corners[i].x<<","<<corners[i].y<<")"<<endl; }}//-----------------------------------【ShowHelpText( )函数】----------------------------------//          描述:输出一些帮助信息//----------------------------------------------------------------------------------------------static void ShowHelpText( ){ printf("\n\n\t\t\t   当前使用的OpenCV版本为:" CV_VERSION );printf("\n\n  ----------------------------------------------------------------------------\n");//输出一些帮助信息printf("\n\t欢迎来到【亚像素级角点检测】示例程序\n\n"); printf("\n\t请调整滑动条观察图像效果\n\n");}//--------------------------------------【main( )函数】-----------------------------------------//          描述:控制台应用程序的入口函数,我们的程序从这里开始执行//-----------------------------------------------------------------------------------------------int main(  ){//【0】改变console字体颜色system("color 2F"); //【0】显示帮助文字ShowHelpText();//【1】载入源图像并将其转换为灰度图g_srcImage = imread("1.jpg", 1 );cvtColor( g_srcImage, g_grayImage, CV_BGR2GRAY );//【2】创建窗口和滑动条,并进行显示和回调函数初始化namedWindow( WINDOW_NAME, CV_WINDOW_AUTOSIZE );createTrackbar( "最大角点数", WINDOW_NAME, &g_maxCornerNumber, g_maxTrackbarNumber, on_GoodFeaturesToTrack );imshow( WINDOW_NAME, g_srcImage );on_GoodFeaturesToTrack( 0, 0 );waitKey(0);return(0);}


0 0