1 // liantongyu.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include <iostream>
6 #include<numeric>
7 #include<opencv2opencv.hpp>
8 #include <opencv2/core/core.hpp>
9 #include <opencv2/imgproc/imgproc.hpp>
10 #include <opencv2/highgui/highgui.hpp>
11 #include <opencv2/video/video.hpp>
12
13 using namespace cv;
14 using namespace std;
15
16 void contourDelete(Mat &bwImg, Mat &bwImg1, Rect &rect)
17 {
18 for (int y = rect.y; y < rect.y + rect.height; y++)
19 {
20 for (int x = rect.x; x < rect.x + rect.width; x++)
21 {
22 const uchar *inData = bwImg.ptr<uchar>(y)+x;
23 uchar *outData = bwImg1.ptr<uchar>(y) + x;
24 if (inData[0]==255)
25 {
26 outData[0] = 0;
27 }
28 }
29 }
30
31 }
32
33 int main()
34 {
35 Mat bwImg,srcImg, bwImg1;
36 srcImg = imread("14.jpg");
37 vector<vector<Point>> contours;
38
39 imshow("original image", srcImg);
40
41 //灰度转换+阈值+形态操作
42 cvtColor(srcImg, srcImg, CV_BGR2GRAY);
43 threshold(srcImg, bwImg, 0.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU);
44 Mat element = getStructuringElement(CV_SHAPE_ELLIPSE, Size(5, 5));
45 morphologyEx(bwImg, bwImg, MORPH_OPEN, element);
46
47 //复制得到bwImage1
48 bwImg1 = bwImg.clone();
49
50 imshow("binary image", bwImg);
51 imshow("bwImg1", bwImg1);
52
53 // 查找轮廓,对应连通域
54 findContours(bwImg, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
55
56 // 寻找最大连通域
57 double maxArea = 0;
58 vector<Point> maxContour;
59 for (size_t i = 0; i < contours.size(); i++)
60 {
61 double area = contourArea(contours[i]);
62 if (area > maxArea)
63 {
64 maxArea = area;
65 maxContour = contours[i];
66 }
67 }
68
69 //输出最大连通区域面积
70 cout << "最大的连通区域面积是:" << maxArea;
71
72 //删除除最大连通域外的所有小连通域
73 for (size_t i = 0; i < contours.size(); i++)
74 {
75 double area = contourArea(contours[i]);
76 Rect rect = boundingRect(contours[i]);
77 if (area < maxArea)
78 {
79 contourDelete(bwImg,bwImg1,rect);
80 }
81 }
82
83 // 将轮廓转为矩形框
84 Rect maxRect =boundingRect(maxContour);
85
86 // 显示连通域
87 Mat result1, result2;
88 bwImg.copyTo(result1);
89 bwImg1.copyTo(result2);
90
91 //显示所有轮廓矩形框
92 for (size_t i = 0; i < contours.size(); i++)
93 {
94 Rect r = boundingRect(contours[i]);
95 rectangle(result1, r,Scalar(255));
96 }
97 imshow("all regions", result1);
98
99 //显示最大轮廓矩形框
100 rectangle(result2, maxRect,Scalar(255));
101 imshow("largest region", result2);
102 imshow("最终结果",bwImg1);
103 waitKey();
104 return 0;
105 }