opencv::自定义角点检测
#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);
}
opencv::自定义角点检测的更多相关文章
- 【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测
角点 特征检测与匹配是Computer Vision 应用总重要的一部分,这需要寻找图像之间的特征建立对应关系.点,也就是图像中的特殊位置,是很常用的一类特征,点的局部特征也可以叫做“关键特征点”(k ...
- OpenCV Shi-Tomasi角点检测子
Shi-Tomasi角点检测子 目标 在这个教程中我们将涉及: 使用函数 goodFeaturesToTrack 来调用Shi-Tomasi方法检测角点. 理论 代码 这个教程的代码如下所示.源代码还 ...
- OpenCV Harris 角点检测子
Harris 角点检测子 目标 本教程中我们将涉及: 有哪些特征?它们有什么用? 使用函数 cornerHarris 通过 Harris-Stephens方法检测角点. 理论 有哪些特征? 在计算机视 ...
- Opencv Shi-Tomasi角点检测
#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...
- Opencv Harris角点检测
#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...
- OpenCV 之 角点检测
角点 (corners) 的定义有两个版本:一是 两条边缘的交点,二是 邻域内具有两个主方向的特征点. 一般而言,角点是边缘曲线上曲率为极大值的点,或者 图像亮度发生剧烈变化的点.例如,从人眼角度来看 ...
- OPENCV(6) —— 角点检测
图像特征的类型通常指边界.角点(兴趣点).斑点(兴趣区域).角点就是图像的一个局部特征,应用广泛.harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性高,尤其对L型角点检测精度高,但由于采 ...
- OpenCV——Harris、Shi Tomas、自定义、亚像素角点检测
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...
- opencv笔记6:角点检测
time:2015年10月09日 星期五 23时11分58秒 # opencv笔记6:角点检测 update:从角点检测,学习图像的特征,这是后续图像跟踪.图像匹配的基础. 角点检测是什么鬼?前面一篇 ...
随机推荐
- JVM垃圾回收?看这一篇就够了!
深入理解JVM垃圾回收机制 1.垃圾回收需要解决的问题及解决的办法总览 1.如何判定对象为垃圾对象 引用计数法 可达性分析法 2.如何回收 回收策略 标记-清除算法 复制算法 标记-整理算法 分带收集 ...
- MOOC C++笔记(四):运算符重载
第四周:运算符重载 基本概念 运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为. 运算符重载的目的是:扩展C++中提供的运算 ...
- [Pandas] 02 - Tutorial of NumPy
Ref: NumPy 教程 这里主要是查缺补漏一些常用方法. 初步认识 矩阵常见知识点 矩阵操作 Ref: [Python] 01 - Number and Matrix[总结过一部分] 一.矩阵 ( ...
- vscode中自动补全<?php?>
方法引用自百度知道的一个回答: 但是他这个我用着需要优化一下,我的代码是: "PHP":{ "prefix": "php", "b ...
- 基于API和SQL的基本操作【DataFrame】
写在前面: 当得到一个DataFrame对象之后,可以使用对象提供的各种API方法进行直接调用,进行数据的处理. // =====基于dataframe的API=======之后的就都是DataFra ...
- Java面向对象笔记(五分钟秒懂)
面向对象概念 面向对象三大特征:封装,继承,多态 面向对象编程(OOP,Object Oriented Programing)是相对于面向过程编程说的,之前写的代码基本都是纯的面向过程编程的,当项目复 ...
- 基于操作系统原理的Linux 的用户管理
一.实验目的 1.掌握为root用户修改密码的方法. 2.掌握创建新用户的方法. 3.掌握用户组的管理方法. 4.掌握为用户授权的方法. 二.实验内容 1.Linux的用户管理 (1)创建新用户创建新 ...
- 23种设计模式之模板方法(Template Pattern)
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 AbstractClass:抽象类.用来定义算法骨架和原语操作,在这个类里 ...
- Android类似日历的翻转控件
最近写了个翻转面板的控件拿出来与大家分享一下,类似日历的那种,写的比较简单有需要的可以直接拿去用.直接上效果图吧,代码我放在百度云了,有问题的话直接回复就好呢,大家一起交流下. http://pan. ...
- selenium实现百度图片爬取
因为是百度图片是瀑布流ajax异步上传的数据,所以这里用到抓包工具来抓取链接(fiddler) 好了直接上代码, from selenium import webdriver from seleniu ...