当前位置: 首页 > news >正文

OpenCV特征检测(4)检测图像中的角点函数cornerHarris()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

Harris 角点检测器。
该函数在图像上运行 Harris 角点检测器。类似于 cornerMinEigenVal 和 cornerEigenValsAndVecs,对于每个像素 (x,y),它在一个 blockSize×blockSize 的邻域内计算一个 2×2 的梯度协方差矩阵 M(x,y)。然后,它计算以下特征值:
dst ( x , y ) = d e t M ( x , y ) − k ⋅ ( t r M ( x , y ) ) 2 \texttt{dst} (x,y) = \mathrm{det} M^{(x,y)} - k \cdot \left ( \mathrm{tr} M^{(x,y)} \right )^2 dst(x,y)=detM(x,y)k(trM(x,y))2
图像中的角点可以作为该响应图的局部最大值被找到。
cv::cornerHarris 是 OpenCV 库中的一个函数,用于检测图像中的角点。该函数基于 Harris 角点检测算法,该算法通过对图像中的每个像素计算一个响应函数来确定角点的位置。响应函数的值越大,表示该像素越有可能是角点。

函数原型


void cv::cornerHarris	
(InputArray 	src,OutputArray 	dst,int 	blockSize,int 	ksize,double 	k,int 	borderType = BORDER_DEFAULT 
)		

参数

  • 参数src 输入单通道 8 位或浮点图像。
  • 参数dst 用于存储 Harris 检测器响应的图像。它具有类型 CV_32FC1 并且大小与 src 相同。
  • 参数blockSize 邻域大小(参见 cornerEigenValsAndVecs 的详细信息)。
  • 参数ksize Sobel 操作符的孔径参数。
  • 参数k Harris 检测器的自由参数。参见上述公式。
  • 参数borderType 像素外推方法。参见 BorderTypes。不支持 BORDER_WRAP。

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>int main()
{// 加载图像cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg", cv::IMREAD_GRAYSCALE );if ( img.empty() ){std::cout << "Error opening image" << std::endl;return -1;}// 计算 Harris 角点响应cv::Mat harrisResponse;int blockSize = 2;     // 邻域大小int ksize     = 3;     // Sobel 梯度算子的大小double k      = 0.04;  // Harris 角点检测器中的自由参数cv::cornerHarris( img, harrisResponse, blockSize, ksize, k );// 显示 Harris 角点响应图像cv::normalize( harrisResponse, harrisResponse, 0, 255, cv::NORM_MINMAX, CV_8U );cv::namedWindow( "Harris Response", cv::WINDOW_NORMAL );cv::imshow( "Harris Response", harrisResponse );// 可选:标记最强的角点double maxVal;cv::minMaxLoc( harrisResponse, nullptr, &maxVal );// 设置阈值double threshold = maxVal * 0.5;// 创建一个新的图像来标记角点cv::Mat markedImg = img.clone();// 标记角点std::vector< cv::Point > corners;cv::Mat_< uchar > responseMat = harrisResponse;for ( int y = 0; y < responseMat.rows; ++y ){for ( int x = 0; x < responseMat.cols; ++x ){if ( responseMat( y, x ) > threshold ){corners.push_back( cv::Point( x, y ) );}}}// 在图像中标记角点for ( const auto& corner : corners ){cv::circle( markedImg, corner, 2, cv::Scalar( 0, 0, 255 ), 2 );  // 画红色圆圈}// 显示标记角点的图像cv::namedWindow( "Marked Corners", cv::WINDOW_NORMAL );cv::imshow( "Marked Corners", markedImg );cv::waitKey( 0 );return 0;
}

运行结果

原始图:
在这里插入图片描述
Harris Response:

在这里插入图片描述

Marked Corners:

在这里插入图片描述

http://www.lryc.cn/news/443308.html

相关文章:

  • Apache Doris 2.1.6 版本正式发布
  • 一些常用的 Docker 命令
  • 【机器学习】--- 自然语言推理(NLI)
  • 大话C++:第11篇 类的定义与封装
  • 六种主流ETL工具的比较与Kettle的实践练习指南--MySQL、hive、hdfs等之间的数据迁移
  • 一天一道算法题day07
  • 电机学习-有感BLDC开环控制(六步换相)
  • 《深度学习》PyTorch框架 优化器、激活函数讲解
  • Linux:进程(四)
  • CTC loss 博客转载
  • TryHackMe 第3天 | Pre Security (中)
  • c语言中“qsort函数”和“结构体成员访问变量”
  • 【MySQL】在MySQL中STR_TO_DATE()
  • PCIE集成验证(五)MSI/MSI-X中断
  • leetcode 380.O(1) 时间插入、删除和获取随机元素
  • 基于MicroPython的ESP8266控制PS2摇杆模块的设计方案
  • Spring Boot 3项目使用Swagger3教程
  • linux-系统备份与恢复-系统恢复
  • 【Rust语言】std::collections::HashMap用法
  • 使用SoapUI、Postman工具调用Webservice方法
  • js 与 C++引用和指针的关系
  • python --PyAibote自动化
  • Ubuntu系统开发环境搭建
  • lvs-dr模式实验详解
  • 【RDMA】mlxconfig修改和查询网卡(固件)配置--驱动工具
  • 跨站请求伪造(CSRF)漏洞详解
  • Java+Spring Cloud +UniApp 智慧工地源码,用户PC端、移动端数据同步,支持多端展示
  • 【推广】图书|2024新书《大模型RAG实战:RAG原理、应用与系统构建》汪鹏、谷清水、卞龙鹏等,机械工业出版社
  • 在Unity UI中实现UILineRenderer组件绘制线条
  • C语言中union的用法