34 Opencv 自定义角点检测

server/2024/12/24 2:37:51/

文章目录

  • cornerEigenValsAndVecs
  • cornerMinEigenVal
  • 示例

cornerEigenValsAndVecs

void cornerEigenValsAndVecs(InputArray src,       --单通道输入8位或浮点图像OutputArray dst,    --输出图像,同源图像或CV_32FC(6)int blockSize,         --邻域大小值int apertureSize,    --Sobel算子当中的核大小int borderType=BORDER_DEFAULT --像素外插方法
)//对应于Harris

cornerMinEigenVal

void cornerMinEigenVal(InputArray src,     --单通道输入8位或浮点图像OutputArray dst,  --图像存储的最小特征值。类型为CV_32FC1int blockSize,       --邻域大小值int apertureSize=3,   --Sobel算子的参数int borderType=BORDER_DEFAULT  --像素外插方法
}//对应Shi-Tomasi

示例

#include <opencv2/opencv.hpp> // 包含OpenCV库的头文件
#include <iostream>           // 包含标准输入输出流库#include <math.h>             // 包含数学函数库
using namespace cv;           // 使用cv命名空间,以避免每次调用OpenCV函数时都要写cv::
using namespace std;          // 使用std命名空间,以便使用cout, cin等函数const char* harris_win = "Custom Harris Corners Detector"; // 定义Harris角点检测结果窗口名称
const char* shitomasi_win = "Custom Shi-Tomasi Corners Detector"; // 定义Shi-Tomasi角点检测结果窗口名称
Mat src, gray_src;            // 声明源图像和灰度图变量// Harris角点响应相关的矩阵及最大最小响应值
Mat harris_dst, harrisRspImg;
double harris_min_rsp;
double harris_max_rsp;// Shi-Tomasi角点响应相关的矩阵及最大最小响应值
Mat shiTomasiRsp;
double shitomasi_max_rsp;
double shitomasi_min_rsp;int sm_qualitylevel = 30;     // Shi-Tomasi质量级别初始值
int qualityLevel = 30;        // Harris质量级别初始值
int max_count = 100;          // 滑动条的最大值void CustomHarris_Demo(int, void*); // 声明Harris角点检测回调函数
void CustomShiTomasi_Demo(int, void*);// 声明Shi-Tomasi角点检测回调函数int main(int argc, char** argv) {src = imread("D:/vcprojects/images/home.jpg"); // 读取图片到src Mat对象中if (src.empty()) {                             // 检查是否成功加载图片printf("could not load image...\n");return -1;}namedWindow("input image", CV_WINDOW_AUTOSIZE); // 创建一个名为"input image"的窗口imshow("input image", src);                     // 在该窗口中显示原始图像cvtColor(src, gray_src, COLOR_BGR2GRAY);        // 将BGR格式的src转换为灰度图gray_src// 计算特征值(Harris角点)int blockSize = 3;      // 邻域大小int ksize = 3;          // Sobel算子的孔径参数double k = 0.04;        // Harris公式中的自由参数kharris_dst = Mat::zeros(src.size(), CV_32FC(6)); // 初始化用于存储特征值和向量的矩阵harrisRspImg = Mat::zeros(src.size(), CV_32FC1); // 初始化用于存储Harris响应值的矩阵cornerEigenValsAndVecs(gray_src, harris_dst, blockSize, ksize, 4); // 计算每个像素处的特征值和特征向量// 计算Harris响应值for (int row = 0; row < harris_dst.rows; row++) {for (int col = 0; col < harris_dst.cols; col++) {double lambda1 = harris_dst.at<Vec6f>(row, col)[0]; // 获取第一个特征值double lambda2 = harris_dst.at<Vec6f>(row, col)[1]; // 获取第二个特征值harrisRspImg.at<float>(row, col) = lambda1 * lambda2 - k * pow((lambda1 + lambda2), 2); // 计算Harris响应值}}minMaxLoc(harrisRspImg, &harris_min_rsp, &harris_max_rsp, 0, 0, Mat()); // 找到响应值中的最大最小值namedWindow(harris_win, CV_WINDOW_AUTOSIZE); // 创建一个用于显示Harris角点检测结果的窗口createTrackbar("Quality Value:", harris_win, &qualityLevel, max_count, CustomHarris_Demo); // 创建滑块以调整质量级别CustomHarris_Demo(0, 0); // 初始调用回调函数// 计算最小特征值(Shi-Tomasi角点)shiTomasiRsp = Mat::zeros(src.size(), CV_32FC1); // 初始化用于存储Shi-Tomasi响应值的矩阵cornerMinEigenVal(gray_src, shiTomasiRsp, blockSize, ksize, 4); // 计算每个像素处的最小特征值minMaxLoc(shiTomasiRsp, &shitomasi_min_rsp, &shitomasi_max_rsp, 0, 0, Mat()); // 找到响应值中的最大最小值namedWindow(shitomasi_win, CV_WINDOW_AUTOSIZE); // 创建一个用于显示Shi-Tomasi角点检测结果的窗口createTrackbar("Quality:", shitomasi_win, &sm_qualitylevel, max_count, CustomShiTomasi_Demo); // 创建滑块以调整质量级别CustomShiTomasi_Demo(0, 0); // 初始调用回调函数waitKey(0); // 等待按键事件return 0;
}// Harris角点检测回调函数:根据用户设定的质量级别绘制角点
void CustomHarris_Demo(int, void*) {if (qualityLevel < 10) { // 设定最低质量级别qualityLevel = 10;}Mat resultImg = src.clone(); // 复制原始图像用于绘制角点float t = harris_min_rsp + (((double)qualityLevel) / max_count) * (harris_max_rsp - harris_min_rsp); // 根据质量级别计算阈值for (int row = 0; row < src.rows; row++) {for (int col = 0; col < src.cols; col++) {float v = harrisRspImg.at<float>(row, col); // 获取当前像素的Harris响应值if (v > t) { // 如果响应值大于阈值,则认为是角点circle(resultImg, Point(col, row), 2, Scalar(0, 0, 255), 2, 8, 0); // 在图像上绘制红色圆圈标记角点}}}imshow(harris_win, resultImg); // 显示带有角点标记的图像
}// Shi-Tomasi角点检测回调函数:根据用户设定的质量级别绘制角点
void CustomShiTomasi_Demo(int, void*) {if (sm_qualitylevel < 20) { // 设定最低质量级别sm_qualitylevel = 20;}Mat resultImg = src.clone(); // 复制原始图像用于绘制角点float t = shitomasi_min_rsp + (((double)sm_qualitylevel) / max_count) * (shitomasi_max_rsp - shitomasi_min_rsp); // 根据质量级别计算阈值for (int row = 0; row < src.rows; row++) {for (int col = 0; col < src.cols; col++) {float v = shiTomasiRsp.at<float>(row, col); // 获取当前像素的Shi-Tomasi响应值if (v > t) { // 如果响应值大于阈值,则认为是角点circle(resultImg, Point(col, row), 2, Scalar(0, 0, 255), 2, 8, 0); // 在图像上绘制红色圆圈标记角点}}}imshow(shitomasi_win, resultImg); // 显示带有角点标记的图像
}

http://www.ppmy.cn/server/152640.html

相关文章

【前端面试】list转树、拍平, 指标,

这个题目涉及的是将一组具有父子关系的扁平数据转换为树形结构&#xff0c;通常称为“树形结构的构建”问题。类似的题目包括&#xff1a; 1. 组织架构转换 给定一个公司的员工列表&#xff0c;每个员工有 id 和 managerId&#xff0c;其中 managerId 表示该员工的上级。任务…

Flink执行模式(批和流)如何选择

DataStream API支持不同的运行时执行模式(batch/streaming),你可以根据自己的需求选择对应模式。 DataStream API的默认执行模式就是streaming,用于需要连续增量处理并且预计会一直保持在线的无界(数据源输入是无限的)作业。 而batch执行模式则用于有界(输入有限)作业…

The option ‘android.enableAapt2‘ is deprecated and should not be used anymore.

The option android.enableAapt2 is deprecated and should not be used anymore. Use android.enableAapt2true to remove this warning. It will be removed at the end of 2018.. android.enableAapt2已经被弃用了&#xff0c;不能被使用了,但是遍寻项目都找不到有使用过en…

构建高性能异步任务引擎:FastAPI + Celery + Redis

在现代应用开发中&#xff0c;异步任务处理是一个常见的需求。无论是数据处理、图像生成&#xff0c;还是复杂的计算任务&#xff0c;异步执行都能显著提升系统的响应速度和吞吐量。今天&#xff0c;我们将通过一个实际项目&#xff0c;探索如何使用 FastAPI、Celery 和 Redis …

go语言学习之错误记录-1、GOPROXY

go语言下载包时报错&#xff0c;更改代码仓库下载地址 go: golang.org/x/netv0.0.0-20210929193557-e81a3d93ecf6: Get “https://proxy.golang.org/golang.org/x/net/v/v0.0.0-20210929193557-e81a3d93ecf6.mod”: dial tcp 142.250.217.113:443: connectex: A connection at…

STM32中ADC模数转换器

一、ADC简介 ADC模拟-数字转换器 ADC可以将引脚连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 12位逐次逼近型ADC&#xff0c;1us转换时间 输入电压范围&#xff1a; 0~3.3V&#xff0c;转换结果范围&#xff1a;0~4095 18个输入…

【大数据】Flink + Kafka 实现通用流式数据处理详解

目录 一、前言 二、流式数据处理场景介绍 2.1 流式数据处理概述 2.1.1 流式数据处理场景介绍 2.2 流式数据处理技术栈 2.2.1 数据采集 2.2.2 数据处理 2.2.3 数据存储 2.2.4 数据展示 2.3 流式数据处理场景面临的问题和挑战 三、通用的流式数据处理场景解决方案 3.1…

【报错】node:internal/modules/cjs/loader:936

报错问题&#xff1a; 当执行npm run dev后&#xff0c;出现下面错误 这个错误一般是由于Node.js无法找到所需的模块而引起的&#xff0c;解决此问题的一种方法就是重新安装所需的模块。 解决办法&#xff1a; 删除npm install 所下载在项目里的node_modules文件执行操作&…