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

news/2024/12/22 1:10:58/

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/news/1534889.html

相关文章

MATLAB计算与建模常见函数:4.插值

插值 什么是插值&#xff1f; 通常实验测量或者采集的数据都是离散数值&#xff1b;插值是指在所给的基准数据情况下&#xff0c;研究如何平滑地估算出基准数据之间其它点的函数数值&#xff1b;一些点的数据无法获得&#xff0c;或者获取这些点的数据代价较高时&#xff0c;…

C++11--智能指针

引入 为什么需要智能指针&#xff1f; 在介绍异常时&#xff0c;遇到以下场景&#xff0c;处理异常就会比较棘手&#xff1a; void Func() {int* arr1 new int[10];int* arr2 new int[20];int* arr3 new int[30];// ...delete[] arr1;delete[] arr2;delete[] arr3; }这里…

【学习资源】人在环路的机器学习

说明&#xff1a;本文图片和内容来源 Human-in-the-Loop Machine Learning Human-in-the-Loop Machine Learning Active learning and annotation for human-centered AI by Robert (Munro) Monarch, June 2021 介绍Human-in-the-Loop的目标&#xff0c;学习过程&#xff0c…

vscode中配置python虚拟环境

python虚拟环境作用 Python虚拟环境允许你为每个独立的项目创建一个隔离的环境&#xff0c;这样每个项目都可以拥有自己的一套Python安装包和依赖&#xff0c;不会互相影响。实际使用中&#xff0c;可以在vscode或pycharm中使用虚拟环境。 1.创建虚拟环境的方法&#xff1a; …

Ubuntu安装Hadoop3.4

1、创建Hadoop用户 sudo adduser hadoop 将Hadoop加进sudo用户组,赋予更高权限: sudo usermod -G sudo hadoop 3、安装JDK(略) 查看JDK安装路径:which java 和 ls -al 3、配置SSH免密登录 在Hadoop分布式集群环境中,各个机器之间的通信通常需要使用SSH的方式进行连…

算法入门(C#):输入日期得到下一天的日期

#include<stdio.h> int main() { int n, y, r;//n:年, y:月, r:日 scanf("%d%d%d", &n, &y, &r); if (n > 0 && y > 0 && y < 13 && r>0) {//检查输入的日期是否合法 // 处理2月的情…

如何给自己的平台搭建一个ip禁令系统

搭建一个IP禁令系统可以帮助你管理用户访问&#xff0c;阻止恶意用户或不合规行为。以下是一些常见的步骤和方法&#xff1a; 1. 选择技术栈 选择适合你的平台的技术栈&#xff0c;例如&#xff1a; Web服务器&#xff1a;Apache、Nginx等。编程语言&#xff1a;Python、PHP…

第四章-课后练习5:修正指数曲线模型——excel和python应用(2)

一、修正指数曲线模型——excel应用 对于以下数据: 年份销售量201346000201449000