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

打印 上一主题 下一主题

主题 1377|帖子 1377|积分 4131

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
总的来说,就是利用主成分分析方法得到轮廓的主特征向量,根据主特征向量来盘算轮廓的角度
(1)找图像中的轮廓

   读取图像,对图像举行HSV转换,使用明暗通道的图像举行处理轮廓提取
  1. cv::Mat imSrc = cv::imread("xx/xx.jpeg");
  2. cv::Mat imHSV;
  3. cv::cvtColor(imSrc, imHSV, cv::COLOR_RGB2HSV);
  4. std::vector<cv::Mat> vImHSV;
  5. cv::split(imHSV, vImHSV);
  6. cv::Mat imVal = vImHSV[2];
  7. cv::threshold(imVal, imVal, 0, 255,  cv::THRESH_OTSU | cv::THRESH_BINARY_INV);
  8. cv::Mat imProfile = imVal;
  9. cv::Mat kernel = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(3,3));
  10. cv::erode(imProfile, imProfile, kernel, cv::Point(-1, -1), 15);
  11. cv::dilate(imProfile, imProfile, kernel, cv::Point(-1, -1), 20);
  12. cv::erode(imProfile, imProfile, kernel, cv::Point(-1, -1), 5);
  13. std::vector<std::vector<cv::Point>> vCnts;
  14. cv::Mat imProfileTmp;
  15. cv::Canny(imProfile, imProfileTmp, 50, 255);
  16. cv::dilate(imProfileTmp, imProfileTmp, kernel, cv::Point(-1, -1), 15);
  17. cv::erode(imProfileTmp, imProfileTmp, kernel, cv::Point(-1, -1), 15);
  18. cv::findContours(imProfileTmp, vCnts, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
  19. if (vCnts.empty())        return -3;
复制代码
(2)使用主成分分析PCA盘算特征向量

   使用主成分分析盘算轮廓的特征向量,根据特征向量得到轮廓的偏转角度
  根据传入的向量,盘算向量的偏转角度:
  1. // 计算角度
  2. double calculateAngle(const cv::Vec2f& eigenvector) {
  3.         return atan2(eigenvector[1], eigenvector[0]);
  4. }
复制代码
使用PCA盘算轮廓的特征向量:
  1. // 轮廓角度
  2. cv::Mat matV01 = cv::Mat(vCnts01).reshape(1, vCnts01.size());
  3. matV01.convertTo(matV01, CV_32F);
  4. cv::PCA pca1(matV01,cv::Mat(), cv::PCA::DATA_AS_ROW);
  5. double A_angle1 = calculateAngle(pca1.eigenvectors.at<cv::Vec2f>(0));
复制代码
总结:PCA能够不外于依赖特定的轮廓外形来盘算多个轮廓之间的偏转角度,比最小外接矩形法、最小外接椭圆法盘算轮廓之间的偏转角度更为实用

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表