OpenCV (C++) 对象提取(面积过滤、横纵比过滤等等)

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3 #include <math.h>
 4 
 5 using namespace cv;
 6 using namespace std;
 7 
 8 
 9 int main(int argc, char** argv)
10 {
11     Mat src = imread("3 input.bmp", IMREAD_GRAYSCALE);
12     Mat binary, dst = Mat::zeros(src.size(), CV_8UC3);
13     Mat Triangle = dst.clone(), Rect1 = dst.clone(), BigCircle = dst.clone(), SmallCircle = dst.clone();
14 
15     if (src.empty()) {
16         printf("Could not load image...");
17         return -1;
18     }
19     src = ~src;//取反
20     imshow("原图", src);
21     //二值化
22     threshold(src, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
23 
24     //发现轮廓
25     vector<vector<Point>> contours;
26     vector<Vec4i> hireachy;
27     findContours(binary, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());
28 
29     //面积删选
30     for (size_t t = 0; t < contours.size(); t++)
31     {
32         double area = contourArea(contours[t]);
33         if (area < 40000) continue;//将面积小于40000的去掉
34         drawContours(Triangle, contours, t, Scalar(0, 0, 255), 2, 8, Mat(), 0, Point());
35     }
36 
37     for (size_t t = 0; t < contours.size(); t++)
38     {
39         double area = contourArea(contours[t]);
40         if (area > 40000 || area<20000) continue;//将面积小于40000的去掉
41         drawContours(BigCircle, contours, t, Scalar(0, 0, 255), 2, 8, Mat(), 0, Point());
42     }
43 
44     for (size_t t = 0; t < contours.size(); t++)
45     {
46         double area = contourArea(contours[t]);
47         if (area > 20000 || area<15000) continue;//将面积小于40000的去掉
48         drawContours(Rect, contours, t, Scalar(0, 0, 255), 2, 8, Mat(), 0, Point());
49     }
50 
51     for (size_t t = 0; t < contours.size(); t++)
52     {
53         double area = contourArea(contours[t]);
54         if (area > 15000) continue;//将面积小于40000的去掉
55         //其他过滤方法
56 
57         /*//横纵比过滤
58         Rect rect= boundingRect(contours[t]);//返回最小外接矩形
59         float ratio = float(rect.width) / float(rect.height);//计算横纵比
60         if (ratio<1.1&&ratio>0.9) {}
61         
62         //周长过滤
63         float length = arcLength(contours[t], true);//计算轮廓长度
64         
65         */
66 
67         
68         drawContours(SmallCircle, contours, t, Scalar(0, 0, 255), 2, 8, Mat(), 0, Point());
69     }
70     imshow("Triangle", Triangle);
71     imshow("BigCircle", BigCircle);
72     imshow("Rect", Rect1);
73     imshow("SmallCircle", SmallCircle);
74 
75     waitKey(0);
76     return 0;
77 }

猜你喜欢

转载自www.cnblogs.com/long5683/p/9694983.html