1. 程式人生 > >OpenCV學習-不規則ROI的提取

OpenCV學習-不規則ROI的提取

定義 wait tar 提取 idt rac 進行 ace 判斷

不規則ROI的提取

轉自:http://www.cnblogs.com/wjy-lulu/p/6759974.html 作者:寂寞的小乞丐
出處:http://www.cnblogs.com/wjy-lulu/

在網上看到基於opencv3.0之前的API實現不規則ROI的提取,我自己試了一下發現opencv3.0不行,第一想法是我寫的有問題,最後發現是API的改版。原理很簡單。

目標:提取黑線作為ROI

技術分享

原理:先濾波-->>灰度化-->>二值化-->>邊緣提取-->>尋找圖像輪廓-->>輪廓畫在一張空圖像-->>水漫填充圖像輪廓區域-->>兩個圖像與操作

灰度化:

技術分享

二值化:

技術分享

邊緣提取:

技術分享

空白圖像畫輪廓:

技術分享

水漫之後的圖像:

技術分享

與操作之後圖像:

技術分享

為了效果明顯,我畫邊界的時候用的是粗實線,而程序求解的是最大邊,所以看起來邊緣不是很理想,實際操作可以優化

程序:

技術分享
 1 #include<iostream>
 2 #include <opencv2/opencv.hpp>
 3 #include <math.h>
 4 using namespace cv;
 5 using namespace std;
 6 
 7 int Threshold_Value = 50;
 8 const int Threshold_Max_value = 255;
 9 const int Threshold_type_value = 3;
10 double g_Area = 0;
11 
12 RNG rng(12345);
13 
14 Mat input_image, threshold_image, output_image, Middle_image;
15 
16 void Threshold_Image_Bar(int, void *);
17 
18 int main(int argc, char**argv)
19 {
20     input_image = imread("1.jpg");
21     if (input_image.data == NULL) {
22         return -1; cout << "can‘t open image.../";
23     }
24     imshow("Sourse Image", input_image);
25     blur(input_image, Middle_image, Size(3, 3), Point(-1, -1), 4);
26     imshow("Blur Image", Middle_image);
27     cvtColor(Middle_image, Middle_image, COLOR_RGB2GRAY);
28     imshow("Gray Image", Middle_image);
29     namedWindow("Threshold Image", 1);
30     createTrackbar("閾值調整", "Threshold Image", &Threshold_Value, 255, Threshold_Image_Bar);
31     Threshold_Image_Bar(0, 0);
32     waitKey(0);
33     return 0;
34 }
35 
36 void Threshold_Image_Bar(int, void *)
37 {
38     threshold(Middle_image, threshold_image, 90, 255, 3);
39     Canny(threshold_image, threshold_image, Threshold_Value, Threshold_Value * 3);
40     imshow("Threshold Image", threshold_image);
41 
42     vector<vector<Point>> contours;
43     vector<Vec4i> hireachy;
44     findContours(threshold_image, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(-1, -1));
45     char flag_count = 0;
46     Mat Show_threImage = Mat::zeros(threshold_image.size(), CV_8UC3);
47     RotatedRect MinRect;
48     for (size_t i = 0; i < contours.size(); i++)
49     {
50         const Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
51         drawContours(Show_threImage, contours, static_cast<int>(i), color, 2, 8, hireachy, 0, Point());
52         //----利用面積進行判斷是否為最大區域------//
53         double area = contourArea(contours[i]);
54         g_Area = g_Area > area ? g_Area : area;
55         flag_count = (area == g_Area) ? static_cast<int>(i) : flag_count;//記錄最大邊界
56     }
57     imshow("Draw_Image_Contours", Show_threImage);
58 
59     Mat gray, Change_image = Mat::zeros(input_image.size(), input_image.type());
60     gray.create(input_image.size(), input_image.type());
61     drawContours(gray, contours, flag_count, Scalar(255, 255, 255), 2, 8, hireachy, 0, Point());
62     Rect s = boundingRect(contours[flag_count]);//為了找內部的一個種子點,自己隨便定義也可以
63     floodFill(gray, Point(s.x + s.width / 2, s.y + s.height / 2), Scalar(255, 255, 255));//黑色區域變成白色,遇到白色區域停止
64     imshow("123", gray);
65     bitwise_and(input_image, gray, gray);
66     imshow("wjy", gray);
67 
68 }
技術分享

OpenCV學習-不規則ROI的提取