OpenCV特征检测(3)计算图像中每个像素处的特征值和特征向量函数cornerEigenValsAndVecs()的使用

news/2024/9/25 0:53:17/
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

计算图像块的特征值和特征向量用于角点检测。
对于每一个像素 p ,函数 cornerEigenValsAndVecs 考虑一个 blockSize × blockSize 的邻域 S§ 。它计算邻域内的协变矩阵 M ,公式如下:
M = [ ∑ S ( p ) ( d I / d x ) 2 ∑ S ( p ) d I / d x d I / d y ∑ S ( p ) d I / d x d I / d y ∑ S ( p ) ( d I / d y ) 2 ] M = \begin{bmatrix} \sum _{S(p)}(dI/dx)^2 & \sum _{S(p)}dI/dx dI/dy \\ \sum _{S(p)}dI/dx dI/dy & \sum _{S(p)}(dI/dy)^2 \end{bmatrix} M=[S(p)(dI/dx)2S(p)dI/dxdI/dyS(p)dI/dxdI/dyS(p)(dI/dy)2]
其中导数使用 Sobel 操作符进行计算。
之后,它找到 M 的特征向量和特征值,并将它们存储在目标图像中,格式为 (λ1, λ2, x1, y1, x2, y2),其中

  • λ1, λ2 是未排序的 M 的特征值;
  • x1, y1 是对应于 λ1 的特征向量;
  • x2, y2 是对应于 λ2 的特征向量。

该函数的输出可以用于稳健的边缘或角点检测。

函数原型

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

参数

  • 参数src:输入单通道 8 位或浮点图像。
  • 参数dst:用于存储结果的图像。它与 src 大小相同,类型为 CV_32FC(6)。
  • 参数blockSize:邻域大小(参见下面的详细信息)。
  • 参数ksize:Sobel 操作符的孔径参数。
  • 参数borderType:像素外推方法。参见 BorderTypes。不支持 BORDER_WRAP。

代码示例


#include <opencv2/opencv.hpp>
#include <iostream>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;}// 计算特征值和特征向量cv::Mat eigen;int blockSize = 3; // 邻域大小int ksize = 3; // Sobel 梯度算子的大小cv::cornerEigenValsAndVecs(img, eigen, blockSize, ksize);// 显示特征值cv::Mat eigenVal1(img.rows, img.cols, CV_32F);cv::Mat eigenVal2(img.rows, img.cols, CV_32F);cv::Mat eigenVec1(img.rows, img.cols, CV_32FC2);cv::Mat eigenVec2(img.rows, img.cols, CV_32FC2);// 分离特征值和特征向量for (int y = 0; y < img.rows; ++y){for (int x = 0; x < img.cols; ++x){// 获取每个像素处的特征值和特征向量const cv::Vec4f& eigenRow = eigen.at<cv::Vec4f>(y, x);eigenVal1.at<float>(y, x) = eigenRow[0]; // 第一个特征值eigenVal2.at<float>(y, x) = eigenRow[1]; // 第二个特征值eigenVec1.at<cv::Vec2f>(y, x) = cv::Vec2f(eigenRow[2], eigenRow[3]); // 第一个特征向量eigenVec2.at<cv::Vec2f>(y, x) = cv::Vec2f(eigenRow[4], eigenRow[5]); // 第二个特征向量}}// 显示特征值图像cv::normalize(eigenVal1, eigenVal1, 0, 255, cv::NORM_MINMAX, CV_8U);cv::imshow("Original Image", img);cv::imshow("Eigen Value 1", eigenVal1);cv::normalize(eigenVal2, eigenVal2, 0, 255, cv::NORM_MINMAX, CV_8U);cv::imshow("Eigen Value 2", eigenVal2);cv::waitKey(0);return 0;
}

运行结果

在这里插入图片描述


http://www.ppmy.cn/news/1530037.html

相关文章

前端JavaScript导出excel,并用excel分析数据,使用SheetJS导出excel

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…

Python 课程12-Python 自动化应用

前言 Python 自动化应用 可以帮助开发者节省时间和精力&#xff0c;将重复性、手动操作变为自动化脚本。例如&#xff0c;Python 可以用于自动化处理文件、邮件、生成报表&#xff0c;甚至可以控制浏览器执行复杂的网页操作任务。借助 Python 的强大库和工具&#xff0c;可以轻…

达梦-华为鲲鹏ARM架构下性能测试最佳实践

一、测试综述 1.1 测试目的 本次测试的目的是验证达梦数据库&#xff0c;在鲲鹏服务器下&#xff0c;不同服务器参数基于sysbench性能压力测试的表现。本次参数是根据为华为鲲鹏arm服务器调优十板斧内建议值调整 成长地图-鲲鹏开发套件开发文档-鲲鹏社区 1.2 通用指标 指标…

信息安全工程师(8)网络新安全目标与功能

前言 网络新安全目标与功能在当前的互联网环境中显得尤为重要&#xff0c;它们不仅反映了网络安全领域的最新发展趋势&#xff0c;也体现了对网络信息系统保护的不断加强。 一、网络新安全目标 全面防护与动态应对&#xff1a; 目标&#xff1a;建立多层次、全方位的网络安全防…

VSCode集成Python环境搭建配置详细步骤

1. 安装VSCode 在开始我们的Python编程之旅前,首先需要准备好我们的开发工具——Visual Studio Code,简称VSCode。VSCode是一款由微软开发的轻量级但功能强大的源代码编辑器,支持多种编程语言,并且拥有丰富的扩展生态系统。接下来,我们将一步步教你如何下载、安装以及汉化…

基于python的django微博内容网络分析系统,实现文本划分词结构

本项目旨在开发一个基于Python的Django框架的微博内容网络分析系统&#xff0c;聚焦于微博文本的分词处理、名词提取和主成分分析。该系统通过数据收集与预处理、分词及结构化文本分析&#xff0c;为舆情监测、话题分析和用户行为研究提供了一体化的解决方案。 主要功能包括&a…

基于微信小程序的剧本杀游玩一体化平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的剧…

linux的redir命令实现端口转发

文章目录 linux的redir命令实现端口转发redirredir 和 ssh端口转发的功能比较redir安装redir使用方式SSH 端口转发 linux的redir命令实现端口转发 redir 官方github&#xff1a;https://github.com/troglobit/redir 官方文档&#xff1a;https://manpages.debian.org/testing…