1 #include <opencv2/opencv.hpp>
2 #include <iostream>
3
4 using namespace cv;
5 using namespace std;
6
7 Mat mat_to_samples(Mat &image);
8 int main(int argc, char** argv)
14 namedWindow("输入图像", CV_WINDOW_AUTOSIZE);
15 imshow("输入图像", src);
16
17 // 组装数据
18 Mat points = mat_to_samples(src);
19
20 // 运行KMeans
21 int numCluster = 4;
22 Mat labels;
23 Mat centers;
24 TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 0.1);
25 kmeans(points, numCluster, labels, criteria, 3, KMEANS_PP_CENTERS, centers);
26
27 // 去背景+遮罩生成
28 Mat mask=Mat::zeros(src.size(), CV_8UC1);
29 int index = src.rows*2 + 2;
30 int cindex = labels.at<int>(index, 0);
31 int height = src.rows;
32 int width = srcols;
33 //Mat dst;
34 //srcopyTo(dst);
35 for (int row = 0; row < height; row++) else
47 }
48 }
49 imshow("mask遮罩", mask);
50
51 // 腐蚀 + 高斯模糊
52 Mat k = getStructuringElement(MORPH_RECT, Size(3, 3), Point(1, 1));//用3*3像素进行腐蚀(减少3*3)
53 erode(mask, mask, k);
54 imshow("腐蚀mask", mask);
55 GaussianBlur(mask, mask, Size(3, 3), 0, 0);//用3*3像素进行高斯模糊(增加3*3) 所以边界不变
56 imshow("高斯模糊mask", mask);
57
58 // 通道混合
59 RNG rng(12345);//随机数
60 Vec3b color;
61 color[0] = 217;//rng.uniform(0, 255);
62 color[1] = 60;// rng.uniform(0, 255);
color[2] = 160;// rng.uniform(0, 255);
64 Mat result(src.size(), src.type());
65
66 double w = 0.0;
67 int b = 0, g = 0, r = 0;
68 int b1 = 0, g1 = 0, r1 = 0;
69 int b2 = 0, g2 = 0, r2 = 0;
70
71 for (int row = 0; row < height; row++)
77 else if (m == 0)
80 else
98 }
99 }
100 imshow("背景替换", result);
101
102 waitKey(0);
103 return 0;
104 }
105
106 Mat mat_to_samples(Mat &image)
122 }
123 return points;
124 }
上一篇:ITK 实例16 阈值水平集算法对脑部PNG图像进行二维分割
下一篇:OpenCV3.3深度神经网络DNN模块 实例1:读取单张PNG文件(opencv3.3环境测试)
OpenCV









