基於OpenCV的findContours查詢影象連通域,並進行排序
阿新 • • 發佈:2018-12-21
//基於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); }