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

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

  • 操作系统: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;
}

运行结果

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【ShuQiHere】深入理解布尔代数中的 SOP、POS、DNF 和 CNF
  • c# 线程等待变量的值符合条件
  • C++重生之我是001
  • 【django】局域网访问django启动的项目
  • [Java并发编程] synchronized(含与ReentrantLock的区别)
  • 常见的中间件漏洞
  • JVM 调优篇7 调优案例2-元空间的优化解决
  • 【什么是B/S、C/S架构】
  • 408算法题leetcode--第11天
  • nginx架构篇(三)
  • PHP环境搭建
  • 数据结构--第七章查找
  • 机器翻译之Bahdanau注意力机制在Seq2Seq中的应用
  • Linux操作系统面试题记录
  • 国内可以使用的ChatGPT服务【9月持续更新】
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 03Go 类型总结
  • conda常用的命令
  • IOS评论框不贴底(ios12新bug)
  • JavaScript设计模式之工厂模式
  • MySQL-事务管理(基础)
  • Netty 4.1 源代码学习:线程模型
  • node 版本过低
  • PHP变量
  • ReactNativeweexDeviceOne对比
  • Vultr 教程目录
  • 关于 Cirru Editor 存储格式
  • 缓存与缓冲
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 如何在GitHub上创建个人博客
  • 王永庆:技术创新改变教育未来
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • linux 淘宝开源监控工具tsar
  • Mac 上flink的安装与启动
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #单片机(TB6600驱动42步进电机)
  • #控制台大学课堂点名问题_课堂随机点名
  • (13)DroneCAN 适配器节点(一)
  • (5)STL算法之复制
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (回溯) LeetCode 40. 组合总和II
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (一)80c52学习之旅-起始篇
  • (原创)可支持最大高度的NestedScrollView
  • (转)德国人的记事本
  • ..回顾17,展望18
  • .bat文件调用java类的main方法
  • .NET 材料检测系统崩溃分析
  • .net 连接达梦数据库开发环境部署
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NetCore发布到IIS
  • ??eclipse的安装配置问题!??
  • ??javascript里的变量问题