1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include<opencv2/imgcodecs.hpp> #include<opencv2/highgui.hpp> #include<opencv2/imgproc.hpp> #include<iostream>
using namespace std; using namespace cv;
void getContours(Mat imgDil,Mat img) { vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(imgDil, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); vector<vector<Point>> conPoly(contours.size()); vector<Rect> boundRect(contours.size()); for (int i = 0; i < contours.size(); i++) { int area = contourArea(contours[i]); string objectType; if (area > 1000) { float peri = arcLength(contours[i], true); approxPolyDP(contours[i], conPoly[i],0.02*peri,true); boundRect[i]=boundingRect(conPoly[i]); int objCor = (int)conPoly[i].size(); cout << objCor << endl; if (objCor == 3) {objectType = "Tri";} else if (objCor == 4) { float aspRatio = (float)boundRect[i].width / (float)boundRect[i].height; if (aspRatio > 0.95 && aspRatio < 1.05) { objectType = "Square";} else objectType = "Rect"; } else if (objCor > 4) { objectType = "Circle";} drawContours(img, conPoly, i, Scalar(255, 0, 255), 2); rectangle(img, boundRect[i].tl(), boundRect[i].br(), Scalar(0, 255, 0), 5); putText(img, objectType, {boundRect[i].x,boundRect[i].y-5}, FONT_HERSHEY_PLAIN, 1, Scalar(0, 69, 255), 2); } } }
|