《图像处理实例》 之 物体计数

目标:

《图像处理实例》 之 物体计数_第1张图片

灰度化--->>>阈值化--->>>形态学:

《图像处理实例》 之 物体计数_第2张图片

因为玉米都连在一起了,没办法通过形态学分割,所以进行距离变换:

《图像处理实例》 之 物体计数_第3张图片

阈值操作,这点需要进行可变的阈值进行观察,找到一个合适的阈值:

《图像处理实例》 之 物体计数_第4张图片

轮廓查找计数:

《图像处理实例》 之 物体计数_第5张图片

 

遇到的问题:

A.  

    1.用下面这个自适应阈值必须进行数据的转换,不能直接传入数据!不然程序一直崩溃,找了很久才发现。

    2.最后一个参数给个0就可以了,倒数第二个参数为大于1的数。

  3.倒数第二个参数一定为基数,当为偶数的时候一直奔溃!!!

    Middle_image.convertTo(show_image, CV_8U);

    adaptiveThreshold(show_image, output_image, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 79, 0);

B.

  1.下面这个距离变换第三个参数:名义上是那么多参数,我试了一下可以使用的是前四个,后面使用之后就崩溃,具体原因我也不知道。

 1 enum DistanceTypes {
 2 DIST_USER = -1, //!< User defined distance
 3 DIST_L1 = 1, //!< distance = |x1-x2| + |y1-y2|
 4 DIST_L2 = 2, //!< the simple euclidean distance
 5 DIST_C = 3, //!< distance = max(|x1-x2|,|y1-y2|)
 6 DIST_L12 = 4, //!< L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1))
 7 DIST_FAIR = 5, //!< distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998
 8 DIST_WELSCH = 6, //!< distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846
 9 DIST_HUBER = 7 //!< distance = |x|
10 };

    2.输出参数要求是8-bit or 32-bit floating-point,就是CV_8FU1、CV_32FU1,其实直接定义个Mat,然后传入数据就行了。

   distanceTransform(Middle_image, Middle_image, DIST_L2, DIST_MASK_3, 5);

代码:

C.

  定义数组长度的时候千万多比实际使用多一点,不然就一直崩溃!!!

     char countText[50];//
     sprintf(countText,"The Corn count is : %d", static_cast(i));

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include
 3 #include 
 4 #include 
 5 using namespace cv;
 6 using namespace std;
 7 
 8 RNG rng(12345);
 9 
10 Mat input_image, threshold_image, output_image, Middle_image, show_image;
11 int g_value = 68;
12 
13 void AdjustThresholdValue(int, void*);
14 
15 int main(int argc, char**argv)
16 {
17     input_image = imread("1.jpg");
18     if (input_image.data == NULL) {
19         return -1; cout << "can't open image.../";
20     }
21     imshow("Sourse Image", input_image);
22     cvtColor(input_image, Middle_image, COLOR_RGB2GRAY);
23     //imshow("Gray Image", Middle_image);
24     threshold(Middle_image, Middle_image,0,255, THRESH_BINARY| THRESH_TRIANGLE);
25     //imshow("Gray Image", Middle_image);
26     Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
27     morphologyEx(Middle_image, Middle_image, MORPH_CLOSE,kernel);
28     //imshow("morphology Image", Middle_image);
29     morphologyEx(Middle_image, Middle_image, MORPH_DILATE, kernel);
30     imshow("dilate Image", Middle_image);
31     bitwise_not(Middle_image, Middle_image);
32     imshow("distance Image", Middle_image);
33     distanceTransform(Middle_image, Middle_image, DIST_L2, DIST_MASK_3, 5);
34     normalize(Middle_image, Middle_image, 0, 1, NORM_MINMAX);
35     imshow("distance Image", Middle_image);
36     
37     Middle_image.convertTo(show_image, CV_8U);
38     namedWindow("threshold Image",1);
39     createTrackbar("value","threshold Image",&g_value,100, AdjustThresholdValue);
40     AdjustThresholdValue(0,0);
41     waitKey(0);
42     return 0;
43 }
44 
45 void AdjustThresholdValue(int, void*)
46 {
47     int k = (g_value * 2 + 1);
48     adaptiveThreshold(show_image, output_image, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, k, 0);
49     Mat kernel = getStructuringElement(MORPH_RECT, Size(9, 9), Point(-1, -1));
50     morphologyEx(output_image, output_image, MORPH_OPEN, kernel);
51     imshow("threshold Image", output_image);
52     Mat temp;
53     output_image.copyTo(temp);
54     vector> contours;
55     vector hierarchy;
56     findContours(output_image,contours,hierarchy, RETR_TREE, CHAIN_APPROX_NONE,Point(-1,-1));
57     size_t i;
58     for (i = 0; i < contours.size(); i++)
59     {
60         drawContours(output_image, contours, static_cast<int>(i), Scalar(255, 0, 0), 2);
61     }
62     char countText[50];//定义数组长度的时候千万多比实际使用多一点,不然就一直崩溃!!!
63     sprintf(countText,"The Corn count is : %d", static_cast<int>(i));
64     putText(output_image, countText, Point(30,30), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(255, 255, 255), 2, 16);
65     imshow("Contours Image", output_image);
66 }

 

 

参考:贾老师opencv系列

 

转载于:https://www.cnblogs.com/wjy-lulu/p/6781107.html

你可能感兴趣的:(《图像处理实例》 之 物体计数)