您的位置:首页 > 教育 > 培训 > 装饰网站建设公司_北京疫情即将爆发_广东深圳疫情最新消息今天_谷歌官网下载

装饰网站建设公司_北京疫情即将爆发_广东深圳疫情最新消息今天_谷歌官网下载

2024/10/5 8:54:05 来源:https://blog.csdn.net/qq_42279379/article/details/142643314  浏览:    关键词:装饰网站建设公司_北京疫情即将爆发_广东深圳疫情最新消息今天_谷歌官网下载
装饰网站建设公司_北京疫情即将爆发_广东深圳疫情最新消息今天_谷歌官网下载

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能够不过于依赖特定的轮廓形状来计算多个轮廓之间的偏转角度,比最小外接矩形法、最小外接椭圆法计算轮廓之间的偏转角度更为适用

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com