OpenCV亚像素级的角点检测
2024-08-29 11:49:33
亚像素级的角点检测
理论
代码
这个教程的代码如下所示。源代码还可以从 这个链接下载得到
#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
最新文章
- WebForm使用AngularJS实现下拉框多级联动
- 代理模式 &; Java原生动态代理技术 &; CGLib动态代理技术
- css颜色表示
- linux 管道命令 竖线 ‘ | ’
- 在CSV文件中增加一列属性值
- P1434 滑雪
- Positional parameter are considered deprecated; use named parameters or JPA-style positional parameters instead.
- 数据挖掘-关联规则分析[ZZ]
- js代码判断浏览器种类IE、FF、Opera、Safari、chrome及版本
- 07 - 删除vtkDataObject中的SetExtentTranslator 和 GetExtentTranslator方法 VTK 6.0 迁移
- 自定义控件 闪烁效果的TextView
- Count Primes 解答
- 关于JVM的ClassLoader(转)
- AngularJS框架速写
- iOS 自定义导航栏笔记
- 总结ASP.NET MVC Web Application中将数据显示到View中的几种方式
- 写给Android App开发人员看的Android底层知识(5)
- java之装饰器模式
- 排序算法的C语言实现(下 线性时间排序:计数排序与基数排序)
- Calico搭建配置