OpenCV——Harris、Shi Tomas、自定义、亚像素角点检测
#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std; int main(int argc, char** argv)
{
Mat src;
src = imread("数字.jpg",);
if (src.empty()){
printf("Can not load Image...");
return -;
}
imshow("input Image", src); //进行Harris角点检测
Mat cornerStrength;
cornerHarris(src, cornerStrength,,,0.01);//返回局部最大值作为像素,角点坐标存储在cornerStrength中
imshow("角点检测的图", cornerStrength);//值太小,未转成二值图像显示不明显 Mat harrisCorner;
threshold(cornerStrength, harrisCorner,0.00001,,THRESH_BINARY);
imshow("角点检测的二值图", harrisCorner); waitKey();
return ;
}
#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std; Mat src,src_gray; int thresh = ;
int max_count = ; const char* output_title = "Harris_CornerDetection Result"; void Harris_demo(int,void*); int main(int argc, char** argv)
{
src = imread("数字.jpg");
if (src.empty()) {
printf("Can not load Image...");
return -;
}
imshow("input Image",src); cvtColor(src, src_gray, COLOR_BGR2GRAY); namedWindow(output_title,CV_WINDOW_AUTOSIZE);
createTrackbar("Threshold", output_title,&thresh, max_count, Harris_demo);
Harris_demo(, ); waitKey();
return ;
} void Harris_demo(int, void*) { Mat cornerStrength;
int blockSize = ;
int ksize = ;
double k = 0.04;
cornerHarris(src_gray, cornerStrength, blockSize, ksize,k,BORDER_DEFAULT);//返回局部最大值作为像素,角点坐标存储在cornerStrength中
normalize(cornerStrength, cornerStrength, , , NORM_MINMAX);//归一化
convertScaleAbs(cornerStrength, cornerStrength);//变成8位无符号整型 //循环遍历每个像素,将大于阈值的点画出来
Mat resultImage = src.clone();
for (int row = ; row < resultImage.rows; row++) {
uchar* currentRow = cornerStrength.ptr(row);
for (int col = ; col < resultImage.cols; col++) {
int value = (int)*currentRow;
if (value > thresh) {
circle(resultImage,Point(col,row),,Scalar(,,),,,);
}
currentRow++;
}
} imshow(output_title, resultImage); }
因为公式更简单,所以Shi-Tomasi角点检测比Harris要快得多
#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std; Mat src,src_gray; int num_corners = ;
int max_corners = ;
const char* output_title = "Shi_Tomasi Detector"; void Shi_Tomasi_demo(int,void*); RNG rng(); int main(int argc, char** argv) {
src = imread("数字.jpg");
if (src.empty()) {
printf("could not load image...\n");
return -;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src); cvtColor(src,src_gray,COLOR_BGR2GRAY); namedWindow(output_title, CV_WINDOW_AUTOSIZE);
createTrackbar("角点数:", output_title, &num_corners, max_corners, Shi_Tomasi_demo);
Shi_Tomasi_demo(,); waitKey();
return ;
} void Shi_Tomasi_demo(int, void*) {
if (num_corners < ) num_corners = ; vector<Point2f> corners;//保存检测到的角点
//参数设置
double qualityLevel = 0.01;
double minDistance = ;
int blockSize = ;
bool useHarris = false;//是否使用Harris角点检测
double k = 0.04;//如果前面使用了角点检测,则需要用到这一项,没有则没有用 goodFeaturesToTrack(src_gray,corners,num_corners,qualityLevel,minDistance,Mat(),blockSize,useHarris,k);
printf("Number of detected corner: %d\n",(int)corners.size()); //画出角点
Mat resultImage = src.clone();
for (size_t t=; t < corners.size(); t++)
{
circle(resultImage, corners[t], , Scalar(rng.uniform(, ), rng.uniform(, ), rng.uniform(, )), , , );
}
imshow(output_title, resultImage); }
自定义角点检测器简介:
基于Harris与Shi-Tomasi角点检测
首先通过计算矩阵M得到lamda1和lamda2两个特征值根据他们得到角点响应值
然后自己设置阈值实现计算出阈值得到有效响应值的角点设置
相关API
C++: void cornerEigenValsAndVecs(
InputArray src, --单通道输入8位或浮点图像
OutputArray dst, --输出图像,同源图像或CV_32FC()
int blockSize, --邻域大小值
int apertureSize, --Sobel算子的参数
int borderType=BORDER_DEFAULT --像素外插方法
)//对应于Harris C++: void cornerMinEigenVal(
InputArray src, --单通道输入8位或浮点图像
OutputArray dst, --图像存储的最小特征值。类型为CV_32FC1
int blockSize, --邻域大小值
int apertureSize=, --Sobel算子的参数
int borderType=BORDER_DEFAULT --像素外插方法
}//对应Shi-Tomasi
#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std; Mat src,src_gray;
Mat HarrisRsImage; double harris_min_rsp,harris_max_rsp;
int qualityLevel = ;
int max_count = ; const char* harris_window = "Harris"; void CustomHarris_demo(int, void*); int main(int argc, char** argv)
{
src = imread("数字.jpg");
if (src.empty()) {
printf("Can not load Image...");
return -;
}
imshow("input Image",src); cvtColor(src, src_gray, COLOR_BGR2GRAY); //计算特征值lambda1和lambda2
int blockSize = ;
int ksize = ;
Mat Harris_dst=Mat::zeros(src.size(),CV_32FC());//CV_32FC(6),有6个值要存储
cornerEigenValsAndVecs(src_gray, Harris_dst, blockSize, ksize,); //计算响应
HarrisRsImage = Mat::zeros(src.size(), CV_32FC1);
double k = 0.04;
for (int row = ; row < Harris_dst.rows; row++) {
for (int col = ; col < Harris_dst.cols; col++) {
double lambda1=Harris_dst.at<Vec6f>(row, col)[];
double lambda2= Harris_dst.at<Vec6f>(row, col)[];
HarrisRsImage.at<float>(row, col) = lambda1 * lambda2 - k * pow((lambda1 + lambda2), );
}
} minMaxLoc(HarrisRsImage,&harris_min_rsp,&harris_max_rsp,,,Mat());
namedWindow(harris_window,CV_WINDOW_AUTOSIZE);
createTrackbar("Quality", harris_window,&qualityLevel, max_count,CustomHarris_demo);
CustomHarris_demo(,); waitKey();
return ;
} void CustomHarris_demo(int, void*)
{
if (qualityLevel < ) qualityLevel = ;
Mat resultImage = src.clone(); float thresh = harris_min_rsp + (((double)qualityLevel) / max_count)*(harris_max_rsp - harris_min_rsp);//阈值
for (int row = ; row < src.rows; row++) {
for (int col = ; col < src.cols; col++) {
float value = HarrisRsImage.at<float>(row, col);
if (value > thresh) {
circle(resultImage, Point(col, row), , Scalar(, , ), , , );
} }
} imshow(harris_window, resultImage);
}
//Shi-Tomasi和Harris自定义角点检测 #include <opencv2/opencv.hpp>
#include <iostream> #include <math.h>
using namespace cv;
using namespace std;
const char* harris_win = "Custom Harris Corners Detector";
const char* shitomasi_win = "Custom Shi-Tomasi Corners Detector";
Mat src, gray_src;
// harris corner response
Mat harris_dst, harrisRspImg;
double harris_min_rsp;
double harris_max_rsp;
// shi-tomasi corner response
Mat shiTomasiRsp;
double shitomasi_max_rsp;
double shitomasi_min_rsp;
int sm_qualitylevel = ;
// quality level
int qualityLevel = ;
int max_count = ;
void CustomHarris_Demo(int, void*);
void CustomShiTomasi_Demo(int, void*);
int main(int argc, char** argv) {
src = imread("D:/vcprojects/images/home.jpg");
if (src.empty()) {
printf("could not load image...\n");
return -;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
cvtColor(src, gray_src, COLOR_BGR2GRAY);
// 计算特征值
int blockSize = ;
int ksize = ;
double k = 0.04;
harris_dst = Mat::zeros(src.size(), CV_32FC());
harrisRspImg = Mat::zeros(src.size(), CV_32FC1);
cornerEigenValsAndVecs(gray_src, harris_dst, blockSize, ksize, );
// 计算响应
for (int row = ; row < harris_dst.rows; row++) {
for (int col = ; col < harris_dst.cols; col++) {
double lambda1 =harris_dst.at<Vec6f>(row, col)[];
double lambda2 = harris_dst.at<Vec6f>(row, col)[];
harrisRspImg.at<float>(row, col) = lambda1*lambda2 - k*pow((lambda1 + lambda2), );
}
}
minMaxLoc(harrisRspImg, &harris_min_rsp, &harris_max_rsp, , , Mat());
namedWindow(harris_win, CV_WINDOW_AUTOSIZE);
createTrackbar("Quality Value:", harris_win, &qualityLevel, max_count, CustomHarris_Demo);
CustomHarris_Demo(, ); // 计算最小特征值
shiTomasiRsp = Mat::zeros(src.size(), CV_32FC1);
cornerMinEigenVal(gray_src, shiTomasiRsp, blockSize, ksize, );
minMaxLoc(shiTomasiRsp, &shitomasi_min_rsp, &shitomasi_max_rsp, , , Mat());
namedWindow(shitomasi_win, CV_WINDOW_AUTOSIZE);
createTrackbar("Quality:", shitomasi_win, &sm_qualitylevel, max_count, CustomShiTomasi_Demo);
CustomShiTomasi_Demo(, ); waitKey();
return ;
} void CustomHarris_Demo(int, void*) {
if (qualityLevel < ) {
qualityLevel = ;
}
Mat resultImg = src.clone();
float t = harris_min_rsp + (((double)qualityLevel) / max_count)*(harris_max_rsp - harris_min_rsp);
for (int row = ; row < src.rows; row++) {
for (int col = ; col < src.cols; col++) {
float v = harrisRspImg.at<float>(row, col);
if (v > t) {
circle(resultImg, Point(col, row), , Scalar(, , ), , , );
}
}
} imshow(harris_win, resultImg);
} void CustomShiTomasi_Demo(int, void*) {
if (sm_qualitylevel < ) {
sm_qualitylevel = ;
} Mat resultImg = src.clone();
float t = shitomasi_min_rsp + (((double)sm_qualitylevel) / max_count)*(shitomasi_max_rsp - shitomasi_min_rsp);
for (int row = ; row < src.rows; row++) {
for (int col = ; col < src.cols; col++) {
float v = shiTomasiRsp.at<float>(row, col);
if (v > t) {
circle(resultImg, Point(col, row), , Scalar(, , ), , , );
}
}
}
imshow(shitomasi_win, resultImg);
}
#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std; Mat src,src_gray; int max_corners = ;
int max_count = ; const char* output_title = "SubPix Result"; void SubPixel_demo(int,void*); int main(int argc, char** argv)
{
src = imread("数字.jpg");
if (src.empty()) {
printf("Can not load Image...");
return -;
}
imshow("input Image",src); cvtColor(src, src_gray, COLOR_BGR2GRAY); namedWindow(output_title,CV_WINDOW_AUTOSIZE);
createTrackbar("Corners:", output_title,&max_corners, max_count, SubPixel_demo);
SubPixel_demo(,); waitKey();
return ;
} void SubPixel_demo(int, void*)
{
if (max_corners < ) max_corners = ; //先进行Shi-Tomasi角点检测
vector<Point2f> corners;
double qualityLevel = 0.01;
double minDistance = ;
int blockSize = ;
goodFeaturesToTrack(src_gray, corners,max_corners,qualityLevel,minDistance,Mat());
cout << "number of corners:" << corners.size() << endl; //画出角点
Mat resultImage = src.clone();
for (size_t t = ; t < corners.size(); t++)
{
circle(resultImage, corners[t],,Scalar(,,),,,);
} imshow(output_title, resultImage); Size winSize = Size(,);
Size zerozone = Size(-, -);
TermCriteria tc = TermCriteria(TermCriteria::EPS+ TermCriteria::MAX_ITER,,0.001);//最大值迭代次数40,精度半径0.001
cornerSubPix(src_gray, corners, winSize, zerozone, tc);//corners需要输入初始坐标,然后输出精确坐标(因此前面才会先做Shi—Tomasi)
for (size_t t = ; t < corners.size(); t++)
{
cout << (t + ) << "Point(x,y):" << corners[t].x << "," << corners[t].y << endl;
}
}
OpenCV——Harris、Shi Tomas、自定义、亚像素角点检测的更多相关文章
- 寻找Harris、Shi-Tomasi和亚像素角点
Harris.Shi-Tomasi和亚像素角点都是角点,隶属于特征点这个大类(特征点可以分为边缘.角点.斑点). 一.Harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性较高,但是也可能出 ...
- OpenCV亚像素角点cornerSubPixel()源代码分析
上一篇博客中讲到了goodFeatureToTrack()这个API函数能够获取图像中的强角点.但是获取的角点坐标是整数,但是通常情况下,角点的真实位置并不一定在整数像素位置,因此为了获取更为精确的角 ...
- OpenCV探索之路(十五):角点检测
角点检测是计算机视觉系统中用来获取图像特征的一种方法.我们都常说,这幅图像很有特点,但是一问他到底有哪些特点,或者这幅图有哪些特征可以让你一下子就识别出该物体,你可能就说不出来了.其实说图像的特征,你 ...
- opencv学习之路(32)、角点检测
一.角点检测的相关概念 二.Harris角点检测——cornerHarris() 参考网址: http://www.cnblogs.com/ronny/p/4009425.html #include ...
- OpenCV 之 角点检测
角点 (corners) 的定义有两个版本:一是 两条边缘的交点,二是 邻域内具有两个主方向的特征点. 一般而言,角点是边缘曲线上曲率为极大值的点,或者 图像亮度发生剧烈变化的点.例如,从人眼角度来看 ...
- 【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测
角点 特征检测与匹配是Computer Vision 应用总重要的一部分,这需要寻找图像之间的特征建立对应关系.点,也就是图像中的特殊位置,是很常用的一类特征,点的局部特征也可以叫做“关键特征点”(k ...
- Harris角点及Shi-Tomasi角点检测(转)
一.角点定义 有定义角点的几段话: 1.角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测.图像匹配.视频跟踪.三维建模和目标识别等领域中.也 ...
- 角点检测:Harris角点及Shi-Tomasi角点检测
角点 特征检测与匹配是Computer Vision 应用总重要的一部分,这需要寻找图像之间的特征建立对应关系.点,也就是图像中的特殊位置,是很常用的一类特征,点的局部特征也可以叫做“关键特征点”(k ...
- OpenCV亚像素级的角点检测
亚像素级的角点检测 目标 在本教程中我们将涉及以下内容: 使用OpenCV函数 cornerSubPix 寻找更精确的角点位置 (不是整数类型的位置,而是更精确的浮点类型位置). 理论 代码 这个教程 ...
随机推荐
- Listary Pro- 文件浏览与搜索增强的超级神器
Listary 是一款 Windows 文件浏览增强工具,为 Windows 资源管理器增加智能命令.最近文档以及收藏功能.文件小,功能强大.秒杀系统自带搜索功能!! 它是一款非常优秀的 Window ...
- nodejs 通过nginx后出现响应慢的解决方法
最近用了nodejs搭建服务器,然后用了nginx做了反向代理,项目开发需求,没办法.但是发现了经过代理之后发现网页请求变慢了,而且是不能忍的一分钟以上. 一开始,怀疑是在nodejs那边的问题,结果 ...
- 【代码笔记】iOS-自定义loading
一,效果图. 二,工程图. 三, 代码. ViewController.h #import <UIKit/UIKit.h> //loading #import "GPLoadin ...
- jquery插件-fullpage.js
1⃣️ 简介 fullPage.js 是一个基于 jQuery 的插件,它能够很方便.很轻松的制作出全屏网站,主要功能有: 支持鼠标滚动 支持前进后退和键盘控制 多个回调函数 支持手机.平板触摸事件 ...
- H5音乐播放器源码地址
源码获取 https://pan.baidu.com/s/1pR_bhIFFQWU6TK9ZvrRWIA 安卓安装包下载地址 https://pan.baidu.com/s/1Z8HF5LY ...
- CCNA学习笔记(1) IOS操作系统 路由器 交换机 启动 自检 以及部分命令
注意:以下内容是以思科为学习环境 IOS操作系统启动: 路由和交换机和个人电脑启动没有区别,都会发送新号表示启动状态,也会进入系统自检.只得注意的是:1.一长两短的响声是显卡报警. 2.一声长鸣是内存 ...
- 有关正则表达式的Js方法(replace)
整理一下最近常用的几个有关正则的js方法 replace 语法:stringObject.replace(regexp/substr,replacement) 用法1 const str='abc13 ...
- 更多内容 - 请关注我的 CSDN 博客
欢迎关注我的 CSDN 博客 因为粉丝多数是在 CSDN 上,所以更多内容放在了 我的 CSDN 博客: [点击跳转] 地址:https://icode.blog.csdn.net
- Windows 自动更新服务恢复
之前手贱删除了Windows的自动更新服务,命令: SC DELETE Wuauserv 悲剧的是最近中了[永恒之蓝]病毒,很恼人!杀了毒,最后还是得仰仗Windows的补丁来加固系统.于是想通过SC ...
- Mysql使用优化之处(转)
1 开启事务之前需要rollback 连接句柄.(清理垃圾)2 mysql_ping 失败,程序需要处理重连逻辑:3 mysql_query()执行的SQL语句是一个以‘/0’结尾的字符串,而mysq ...