繼續上一篇 OpenCV3.1 搜尋輪廓與遮罩應用
現在要計算輪廓周長、面積和重心,並且用一多邊形曲線近似該輪廓。
1:2: for (int i = 0; i < contours.size(); i++) {
3: cout << "contour # " << i << endl;
4: imgMask = Mat::zeros(imgSrc.size(), CV_8UC1);5: drawContours(imgMask, contours, i, Scalar(255), -1);6: Mat imgROI;7: imgSrc.copyTo(imgROI, imgMask);8: string name = std::to_string(i);9: //imshow(name, imgROI);
10: cout << "mean color (BGR) = " << mean(imgSrc, imgMask) << endl;
11: Moments m = moments(contours[i]);12: cout << "area = " << m.m00 <<endl;
13: double contArea = contourArea(contours[i]);
14: cout << "contour area = " << contArea << endl;
15: double cx = m.m10 / m.m00;
16: double cy = m.m01 / m.m00;
17: line(imgROI, Point(cx, cy), Point(cx, cy), Scalar(255, 0, 0), 5, 8);18: char label[50];
19: sprintf_s(label, "(%.0f,%.0f)", cx, cy);
20: int offset = 100;
21: putText(imgROI, label, Point(cx-offset, cy), FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 1, 8);22: double perimeter = arcLength(contours[i], true);
23: cout << "perimeter = " << perimeter << endl;
24: vector<Point> polyCurves;25: double epsilon = 0.01;
26: approxPolyDP(contours[i], polyCurves, epsilon*arcLength(contours[i], true), true);27:28: cout << "polygonal curves = " << polyCurves.size() << endl;
29: for (int j = 0; j < polyCurves.size()-1; j++)
30: {31: Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));32: line(imgROI, polyCurves[j], polyCurves[j + 1], color, 3, 8);33: }34:35: line(imgROI, polyCurves[0], polyCurves[polyCurves.size()-1], Scalar(0, 0,255), 3, 8);36:37: imshow(name, imgROI);38: cout << "------------------------------" << endl;
39: }
多邊形曲線近似 epsilon = 0.01
多邊形曲線近似 epsilon = 0.02
--------------------------------------
輪廓極值(minX, maxX, minY, maxY)
1: 2: bool sortByXAscend(Point a, Point b) { return (a.x<b.x); }
3: bool sortByXDescend(Point a, Point b) { return (a.x>b.x); }
4: bool sortByYAscend(Point a, Point b) { return (a.y<b.y); }
5: bool sortByYDescend(Point a, Point b) { return (a.y>b.y); }
1: 2: sort(polyCurves.begin(), polyCurves.end(), sortByXAscend);3: cout << "sortByXAsc : " << polyCurves << endl;
4: circle(imgROI, polyCurves[0], 10, Scalar(0, 0, 255),-1); 5: sort(polyCurves.begin(), polyCurves.end(), sortByXDescend);6: cout << "sortByXDescend : " << polyCurves << endl;
7: circle(imgROI, polyCurves[0], 10, Scalar(0, 255, 0), -1); 8: 9: sort(polyCurves.begin(), polyCurves.end(), sortByYAscend);10: cout << "sortByYAsc : " << polyCurves << endl;
11: circle(imgROI, polyCurves[0], 10, Scalar(255, 255, 0), -1); 12: 13: sort(polyCurves.begin(), polyCurves.end(), sortByYDescend);14: cout << "sortByYDescend : " << polyCurves << endl;
15: circle(imgROI, polyCurves[0], 10, Scalar(255, 255, 255), -1);參考資料
3. std::sort
文章標籤
全站熱搜
