亚像素级的角点检测

目标

在本教程中我们将涉及以下内容:

  • 使用OpenCV函数 cornerSubPix 寻找更精确的角点位置 (不是整数类型的位置,而是更精确的浮点类型位置).

理论

代码

这个教程的代码如下所示。源代码还可以从 这个链接下载得到

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h> using namespace cv;
using namespace std; /// Global variables
Mat src, src_gray; int maxCorners = 10;
int maxTrackbar = 25; RNG rng(12345);
char* source_window = "Image"; /// Function header
void goodFeaturesToTrack_Demo( int, void* ); /** @function main */
int main( int argc, char** argv )
{
/// Load source image and convert it to gray
src = imread( argv[1], 1 );
cvtColor( src, src_gray, CV_BGR2GRAY ); /// Create Window
namedWindow( source_window, CV_WINDOW_AUTOSIZE ); /// Create Trackbar to set the number of corners
createTrackbar( "Max corners:", source_window, &maxCorners, maxTrackbar, goodFeaturesToTrack_Demo); imshow( source_window, src ); goodFeaturesToTrack_Demo( 0, 0 ); waitKey(0);
return(0);
} /**
* @function goodFeaturesToTrack_Demo.cpp
* @brief Apply Shi-Tomasi corner detector
*/
void goodFeaturesToTrack_Demo( int, void* )
{
if( maxCorners < 1 ) { maxCorners = 1; } /// Parameters for Shi-Tomasi algorithm
vector<Point2f> corners;
double qualityLevel = 0.01;
double minDistance = 10;
int blockSize = 3;
bool useHarrisDetector = false;
double k = 0.04; /// Copy the source image
Mat copy;
copy = src.clone(); /// Apply corner detection
goodFeaturesToTrack( src_gray,
corners,
maxCorners,
qualityLevel,
minDistance,
Mat(),
blockSize,
useHarrisDetector,
k ); /// Draw corners detected
cout<<"** Number of corners detected: "<<corners.size()<<endl;
int r = 4;
for( int i = 0; i < corners.size(); i++ )
{ circle( copy, corners[i], r, Scalar(rng.uniform(0,255), rng.uniform(0,255),
rng.uniform(0,255)), -1, 8, 0 ); } /// Show what you got
namedWindow( source_window, CV_WINDOW_AUTOSIZE );
imshow( source_window, copy ); /// Set the neeed parameters to find the refined corners
Size winSize = Size( 5, 5 );
Size zeroZone = Size( -1, -1 );
TermCriteria criteria = TermCriteria( CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 40, 0.001 ); /// Calculate the refined corner locations
cornerSubPix( src_gray, corners, winSize, zeroZone, criteria ); /// Write them down
for( int i = 0; i < corners.size(); i++ )
{ cout<<" -- Refined Corner ["<<i<<"] ("<<corners[i].x<<","<<corners[i].y<<")"<<endl; }
}

解释

结果

亚像素级的角点检测结果:

翻译者

Shuai Zheng, <kylezheng04@gmail.com>, http://www.cbsr.ia.ac.cn/users/szheng/

from: http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/features2d/trackingmotion/corner_subpixeles/corner_subpixeles.html#corner-subpixeles

最新文章

  1. WebForm使用AngularJS实现下拉框多级联动
  2. 代理模式 &amp; Java原生动态代理技术 &amp; CGLib动态代理技术
  3. css颜色表示
  4. linux 管道命令 竖线 ‘ | ’
  5. 在CSV文件中增加一列属性值
  6. P1434 滑雪
  7. Positional parameter are considered deprecated; use named parameters or JPA-style positional parameters instead.
  8. 数据挖掘-关联规则分析[ZZ]
  9. js代码判断浏览器种类IE、FF、Opera、Safari、chrome及版本
  10. 07 - 删除vtkDataObject中的SetExtentTranslator 和 GetExtentTranslator方法 VTK 6.0 迁移
  11. 自定义控件 闪烁效果的TextView
  12. Count Primes 解答
  13. 关于JVM的ClassLoader(转)
  14. AngularJS框架速写
  15. iOS 自定义导航栏笔记
  16. 总结ASP.NET MVC Web Application中将数据显示到View中的几种方式
  17. 写给Android App开发人员看的Android底层知识(5)
  18. java之装饰器模式
  19. 排序算法的C语言实现(下 线性时间排序:计数排序与基数排序)
  20. Calico搭建配置

热门文章

  1. 洛谷 P1359 租用游艇 题解
  2. 在go中连接mysql
  3. CentOS系统初始化---不断更新中
  4. css特效-一道闪光在图片上划过
  5. &lt;c:if&gt;&lt;/c:if&gt;用法-转载
  6. VideoView视频缓冲进度条
  7. Tweet信息搜集工具tinfoleak
  8. Unity Shader 之 渲染流水线
  9. 2017/11/3 Leetcode 日记
  10. NOIP2017 D1T2时间复杂度