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 }
OpenCV (C++) 对象提取(面积过滤、横纵比过滤等等)
猜你喜欢
转载自www.cnblogs.com/long5683/p/9694983.html
今日推荐
周排行