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 cv; using namespace std;
void getContours(Mat imgDil, Mat img) { vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(imgDil, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
for (int i = 0;i < contours.size();i++) {
int area = contourArea(contours[i]); vector<vector<Point>> conPloy(contours.size()); vector<Rect> boundRect(contours.size()); string objectType;
if (area > 1000) { float peri = arcLength(contours[i], true); approxPolyDP(contours[i], conPloy[i], 0.02 * peri, true);
boundRect[i] = boundingRect(conPloy[i]);
int objCor = (int)conPloy[i].size();
if (objCor == 3) { objectType = "Tri"; } 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"; } if (objCor > 4) { objectType = "Circle"; }
putText(img, objectType, { boundRect[i].x, boundRect[i].y - 5 }, FONT_HERSHEY_DUPLEX, 0.75, Scalar(0, 0, 0)); rectangle(img, boundRect[i].tl(), boundRect[i].br(), Scalar(255, 30, 30), 5); } }
}
void main() {
string path = "Resources/shapes.png"; Mat img = imread(path); Mat imgGray, imgBlur, imgCanny, imgDil, imgErode;
cvtColor(img, imgGray, COLOR_BGR2GRAY); GaussianBlur(imgGray, imgBlur, Size(3, 3), 3, 0); Canny(imgBlur, imgCanny, 25, 75); Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5)); dilate(imgCanny, imgDil, kernel);
getContours(imgDil, img);
imshow("Image", img); waitKey(0); }
|