opencv:使用主成分分析PCA计算轮廓的偏转角度

devtools/2024/10/8 21:54:16/

PCA计算轮廓角度

    • (1)找图像中的轮廓
    • (2)使用主成分分析PCA计算特征向量

总的来说,就是利用主成分分析方法得到轮廓的主特征向量,根据主特征向量来计算轮廓的角度

(1)找图像中的轮廓

读取图像,对图像进行HSV转换,使用明暗通道的图像进行处理轮廓提取

cv::Mat imSrc = cv::imread("xx/xx.jpeg");
cv::Mat imHSV;
cv::cvtColor(imSrc, imHSV, cv::COLOR_RGB2HSV);
std::vector<cv::Mat> vImHSV;
cv::split(imHSV, vImHSV);
cv::Mat imVal = vImHSV[2];
cv::threshold(imVal, imVal, 0, 255,  cv::THRESH_OTSU | cv::THRESH_BINARY_INV);
cv::Mat imProfile = imVal;
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(3,3));
cv::erode(imProfile, imProfile, kernel, cv::Point(-1, -1), 15);
cv::dilate(imProfile, imProfile, kernel, cv::Point(-1, -1), 20);
cv::erode(imProfile, imProfile, kernel, cv::Point(-1, -1), 5);
std::vector<std::vector<cv::Point>> vCnts;
cv::Mat imProfileTmp;
cv::Canny(imProfile, imProfileTmp, 50, 255);
cv::dilate(imProfileTmp, imProfileTmp, kernel, cv::Point(-1, -1), 15);
cv::erode(imProfileTmp, imProfileTmp, kernel, cv::Point(-1, -1), 15);
cv::findContours(imProfileTmp, vCnts, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
if (vCnts.empty())	return -3;

(2)使用主成分分析PCA计算特征向量

使用主成分分析计算轮廓的特征向量,根据特征向量得到轮廓的偏转角度

根据传入的向量,计算向量的偏转角度:

// 计算角度
double calculateAngle(const cv::Vec2f& eigenvector) {return atan2(eigenvector[1], eigenvector[0]);
}

使用PCA计算轮廓的特征向量:

// 轮廓角度
cv::Mat matV01 = cv::Mat(vCnts01).reshape(1, vCnts01.size());
matV01.convertTo(matV01, CV_32F);
cv::PCA pca1(matV01,cv::Mat(), cv::PCA::DATA_AS_ROW);
double A_angle1 = calculateAngle(pca1.eigenvectors.at<cv::Vec2f>(0));

总结:PCA能够不过于依赖特定的轮廓形状来计算多个轮廓之间的偏转角度,比最小外接矩形法、最小外接椭圆法计算轮廓之间的偏转角度更为适用


http://www.ppmy.cn/devtools/121659.html

相关文章

【PostgreSQL】入门篇——索引:提高查询性能的利器

1. 索引的概念 描述 索引是数据库表中一个或多个列的值的有序列表。它类似于书籍的目录&#xff0c;可以帮助数据库快速定位到存储在表中的数据。 索引的主要目的是提高数据检索的速度&#xff0c;尤其是在处理大量数据时。 作用 加速查询&#xff1a;通过减少需要扫描的数…

坐标系变换总结

二维情况下的转换 1 缩放变换 形象理解就是图像在x方向和y方向上放大或者缩小。 代数形式&#xff1a; { x ′ k x x y ′ k y y \begin{cases} x k_x x \\ y k_y y \end{cases} {x′kx​xy′ky​y​ 矩阵形式&#xff1a; ( x ′ y ′ ) ( k x 0 0 k y ) ( x y ) \be…

安全点的应用场景及其原理详解

引言 在Java虚拟机&#xff08;JVM&#xff09;运行的过程中&#xff0c;有些时刻&#xff0c;系统需要暂停所有正在运行的线程&#xff0c;以执行某些全局操作或确保数据的一致性。这些暂停线程的时刻被称为**“安全点”**&#xff08;Safepoint&#xff09;。尽管安全点最广…

进程第四章:环境变量

1.铺垫 1.1环境变量是系统提供的一组namevalue形式的变量&#xff0c;不同的环境变量有不同的用户&#xff0c;通常具有全局属性 1.2多个可执行程序的运行&#xff0c;他们的环境变量的部分数据是不同的&#xff0c;比如说PWD等数据 1.3环境变量里的数据&#xff0c;多为K-V…

如何使用工具删除 iPhone 上的图片背景

在 iPhone 上删除背景图像变得简单易行。感谢最近 iOS 更新中引入的新功能。如今&#xff0c;iOS 用户现在可以毫不费力地删除背景&#xff0c;而无需复杂的应用程序。在这篇文章中&#xff0c;您将学习如何使用各种方法去除 iPhone 上的背景。这可确保您可以选择最适合您偏好的…

探索云计算中的 Serverless 架构:未来的计算范式?

目录 引言 一、Serverless架构概览 二、Serverless 架构的优势 三、Serverless架构的挑战 四、Serverless架构的未来展望 五、结论 引言 在当今快速发展的 IT 行业中&#xff0c;云计算无疑占据了举足轻重的地位。随着技术的不断演进&#xff0c;云计算的一个新兴分支——…

jQuery——对象的过滤

在 jQuery 对象中的元素对象数组中过滤出一部分元素来 ① first&#xff08;&#xff09; ② last&#xff08;&#xff09; ③ eq&#xff08;index / -index&#xff09; ④ filter&#xff08;selector&#xff09;&#xff1a;对当前元素提要求 ⑤ not&#xff08;sel…

住宅IP是不会发生变化的吗?

在日常生活中&#xff0c;我们的设备&#xff08;如电脑、手机、智能家居设备等&#xff09;都依赖于IP地址与互联网进行通信。IP地址相当于设备在网络中的身份标识&#xff0c;用于在互联网上接收和发送信息。住宅IP则是为家庭网络分配的IP地址。那么&#xff0c;住宅IP是否会…