//基于OpenCV,对读入图片查找连通域,并把每个连通域包含的坐标点根据y值从小到大进行排序。
#include <opencv2/legacy/legacy.hpp>
#include <opencv2/opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;
//对每条连通域上的各点根据y从小到大进行排序
void SortContourPoint(vector<vector<Point>> inputContours, vector<vector<Point>> &outputContours)
{
vector<Point> tempContoursPoint;
for(int i = 0; i < inputContours.size(); i++)
{
tempContoursPoint.clear(); //每次循环注意清空
for(int j = 0; j < inputContours[i].size(); j++)
{
for(int k = j; k < inputContours[i].size(); k++)
{
if( inputContours[i][j].y > inputContours[i][k].y)
{
swap(inputContours[i][j], inputContours[i][k]);
}
}
tempContoursPoint.push_back(inputContours[i][j]);
}
outputContours.push_back(tempContoursPoint);
}
}
int main()
{
Mat Img;
vector<vector<Point>> allContours; //保存全部连通域
Img = imread("Img.bmp",0); //读入原始图片
imshow("Img.bmp",Img); //显示图片
//CV_RETR_CCOMP表示检测所有的轮廓;
//CV_CHAIN_APPROX_SIMPLE表示仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours;
findContours(Img, allContours, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
cout<<"连通域数量:"<<allContours.size()<<endl;
cout<<"排序前,各连通域的点坐标如下:"<<endl;
for(int i=0; i<allContours.size(); i++)
{
cout<<allContours[i]<<endl;
}
vector<vector<Point>> allContoursAfterSort; //保存排序后的连通域
SortContourPoint(allContours, allContoursAfterSort);
cout<<"排序后,各连通域的点坐标如下:"<<endl;
for(int i=0; i<allContoursAfterSort.size(); i++)
{
cout<<allContoursAfterSort[i]<<endl;
}
waitKey(0);
}