OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 3077|回复: 1

findContous函数寻找轮廓之后如何排序?

[复制链接]
发表于 2019-5-16 11:22:36 | 显示全部楼层 |阅读模式
用findContours函数查找轮廓后求出轮廓对应的正外接矩形,现在想对外接矩形的左上角点进行从左往右从上往下排序,同时还要将排序前轮廓中的点与排序后轮廓中的点对应起来,请问有什么办法可以实现呢?有代码的话更好了
回复

使用道具 举报

发表于 2019-6-2 16:13:39 | 显示全部楼层
本帖最后由 erp80 于 2019-6-2 16:56 编辑
  1. using namespace std;
  2. using namespace cv;
  3. using namespace cv::xphoto;
  4. #include "stdafx.h"
  5. #include <iostream>  
  6. #include<vector>
  7. #include<algorithm>
  8. #include <opencv2\opencv.hpp>  
  9. #include <opencv2\highgui\highgui.hpp>  
  10. using namespace std;
  11. using namespace cv;

  12. //轮廓按照面积大小升序排序
  13. bool ascendSort(vector<Point> a, vector<Point> b) {
  14.         return a.size() < b.size();

  15. }

  16. //轮廓按照面积大小降序排序
  17. bool descendSort(vector<Point> a, vector<Point> b) {
  18.         return a.size() > b.size();
  19. }

  20. //自己实现的将灰度图像转为三通道的BGR图像
  21. cv::Mat gray2BGR(cv::Mat grayImg) {
  22.         if (grayImg.channels() == 3)
  23.                 return grayImg;
  24.         cv::Mat bgrImg = cv::Mat::zeros(grayImg.size(), CV_8UC3);
  25.         std::vector<cv::Mat> bgr_channels;
  26.         cv::split(bgrImg, bgr_channels);
  27.         bgr_channels.at(0) = grayImg;
  28.         bgr_channels.at(1) = grayImg;
  29.         bgr_channels.at(2) = grayImg;
  30.         cv::merge(bgr_channels, bgrImg);
  31.         return bgrImg;
  32. }

  33. //自定义的drawImage函数的功能类似于OpenCV的drawContours函数
  34. cv::Mat drawImage(cv::Mat image, vector< vector< Point> > pointV) {
  35.         cv::Mat destImage=image.clone();
  36.         if (destImage.channels()==1)
  37.         {
  38.                 destImage = gray2BGR(destImage);
  39.         }
  40.         for (size_t i=0;i<pointV.size();i++)
  41.         {
  42.                 for (size_t j = 0; j<pointV.at(i).size(); j++)
  43.                 {
  44.                         cv::Point point = pointV.at(i).at(j);
  45.                         destImage.at<Vec3b>(point) = cv::Vec3b(0, 0, saturate_cast<uchar>(255-i*5));
  46.                 }

  47.         }
  48.         return destImage;
  49. }
  50. int main() {
  51.         Mat srcImage = imread("D:\\OpencvTest\\mask5.jpg");
  52.         cv::imshow("srcImage", srcImage);
  53.         Mat thresholdImage;
  54.         Mat grayImage;
  55.         cvtColor(srcImage, grayImage, CV_BGR2GRAY);
  56.         threshold(grayImage, thresholdImage, 0, 255, CV_THRESH_OTSU + CV_THRESH_BINARY);
  57.         cv::Mat mask = thresholdImage.clone();
  58.         //(1)CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE
  59.         vector< vector< Point> > contours1;
  60.         findContours(mask, contours1, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
  61.         cv::Mat destImage = drawImage(mask, contours1);
  62.         imshow("destImage", destImage);

  63.         //(2)CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE
  64.         vector< vector< Point> > contours2;
  65.         findContours(mask, contours2, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
  66.         cv::Mat destImage2 = drawImage(mask, contours2);
  67.         imshow("destImage2", destImage2);

  68.         //(3)CV_RETR_LIST, CV_CHAIN_APPROX_NONE
  69.         vector< vector< Point> > contours3;
  70.         findContours(mask, contours3, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
  71.         cv::Mat destImage3 = drawImage(mask, contours3);
  72.         imshow("destImage3", destImage3);


  73.         //(4)CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE
  74.         vector< vector< Point> > contours4;
  75.         findContours(mask, contours4, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);
  76.         cv::Mat destImage4 = drawImage(mask, contours4);
  77.         imshow("destImage4", destImage4);


  78.         //cv::Mat imge2 = gray2BGR(mask);
  79.         //drawContours(imge2, contours4, -1, cv::Scalar(0, 0, 255), 1);
  80.         //cv::fillConvexPoly(mask, contours1.at(0), cv::Scalar(255, 255, 255));
  81.         cv::waitKey(0);
  82.         return 0;
  83. }
复制代码

回复 支持 反对

使用道具 举报

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

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-3-28 17:52 , Processed in 0.009413 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表