opencv学习笔记,亚像素级角点检测和waitkey用法说明

来源:互联网 发布:组播编程 编辑:程序博客网 时间:2024/06/05 06:02

在学习亚像素角点检测时遇到bug,最后在回调函数on_GoodFeaturesToTrack( )中需要添加waitkey(0)才能解决,不然一直有错误。

查找资料得到:


The function waitKey waits for a key event infinitely (when \texttt{delay}\leq 0 ) or for delay milliseconds, when it is positive. Since the OS has a minimum time between switching threads, the function will not wait exactly delay ms, it will wait at least delay ms, depending on what else is running on your computer at that time. It returns the code of the pressed key or -1 if no key was pressed before the specified time had elapsed.


Note This function is the only method in HighGUI that can fetch and handle events, so it needs to be called periodically for normal event processing unless HighGUI is used within an environment that takes care of event processing.


Note The function only works if there is at least one HighGUI window created and the window is active. If there are several HighGUI windows, any of them can be active.


waitkey不仅仅是一个键盘事件等待函数,也是处理窗口事件的函数。

源代码如下:

//--------------------------------------【程序说明】-------------------------------------------
// 亚像素级角点检测和waitkey用法说明
// 开发测试所用操作系统: Windows 7 32bit
// 开发测试所用IDE版本:Visual Studio 2015
// 开发测试所用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;


//【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; } 

waitKey(0);//在这里改了代码,加上了waitKey(0);
}


//-----------------------------------【ShowHelpText( )函数】----------------------------------
//          描述:输出一些帮助信息
//----------------------------------------------------------------------------------------------
static void ShowHelpText( )
{
printf("\n\n\t\t\t   当前使用的OpenCV版本为:" CV_VERSION );
printf("\n\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 1