2012-10-17 35 views
11

Tôi muốn tạo ra một bàn tay đầy màu xanh nhưng có được đầu ra không chính xác. Tôi đã bao gồm hình ảnh đầu vào, hình ảnh đầu ra không đúng và mã bên dưới.OpenCV đóng một hình dạng và điền vào nó

tôi nghĩ rằng mã bên dưới không lấp đầy toàn bộ hình ảnh vì hình ảnh chưa được đóng ở ranh giới bên phải.

làm cách nào để đóng hình dạng và tô nó bằng màu xanh đúng cách?

close shape

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 

using namespace cv; 
using namespace std; 

void drawStuff(); 
void showInputWindow(); 
void showCannyWindow(); 
void showContourWindow(); 

int thresh = 40; 
int max_thresh = 120; 
Mat img_rgb,img_gray,img_bw,canny_output,drawing; 

int main(){ 
    img_rgb = imread("qq.jpg"); 
    blur(img_rgb, img_rgb, Size(3,3)); 
    cvtColor(img_rgb,img_gray,CV_RGB2GRAY); 
    showInputWindow(); 

    drawStuff(); 
    cv::waitKey(0); 
} 

void drawStuff(){ 
    vector<vector<Point> > contours; 
    vector<Vec4i> hierarchy; 

    Canny(img_gray, canny_output, thresh, thresh*2, 3); 
    cv::dilate(canny_output, canny_output, cv::Mat(), cv::Point(-1,-1)); 
    showCannyWindow(); 

    findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 
    drawing = Mat::zeros(canny_output.size(), CV_8UC3); 

    vector<Point> approxShape; 
    for(size_t i = 0; i < contours.size(); i++){ 
     approxPolyDP(contours[i], approxShape, arcLength(Mat(contours[i]), true)*0.04, true); 
     drawContours(drawing, contours, i, Scalar(255, 0, 0), CV_FILLED); // fill BLUE 
    } 

    showContourWindow(); 
} 

void showInputWindow(){ 
    cv::namedWindow("InputImage"); 
    cv::imshow("InputImage",img_rgb); 
} 

void showCannyWindow(){ 
    cv::namedWindow("Canny"); 
    cv::imshow("Canny",canny_output); 
} 
void showContourWindow(){ 
    cv::namedWindow("Fill"); 
    cv::imshow("Fill",drawing); 
} 
+2

Tôi nghĩ rằng vấn đề là có những đường nét được phát hiện bên trong bàn tay. Hãy thử một cách tiếp cận nghịch đảo - điền vào các môi trường xung quanh và sau đó đảo ngược nó. –

+0

làm thế nào để bạn lấp đầy môi trường xung quanh? –

+2

Vẽ chỉ các đường viền (không được điền) bằng cách sử dụng một số màu riêng biệt như màu xanh lá cây, sau đó sử dụng cvFloodFill gieo ở góc trên cùng bên trái (coords 0, 0) và tô nó bằng màu xanh lam. Sau đó đi bộ hình ảnh và thay thế các điểm ảnh màu xanh với các điểm ảnh màu đen và đen hoặc màu xanh lá cây với màu xanh lam. –

Trả lời

6

Để giải quyết vấn đề của bạn, bạn nên phát hiện chỉ đường nét bên ngoài. Bằng cách đó, bạn sẽ chỉ nhận được một đường viền và bạn có thể tô màu bằng màu của mình.

findContours(canny_output, contours, hierarchy, Imgproc.RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 
Các vấn đề liên quan