2012-10-17 21 views
11

青く塗りつぶされた手を出力したいが、間違った出力を得たい。入力画像、不適切な出力画像、およびコードを以下に示します。OpenCVシェイプを閉じて塗りつぶす

画像が右境界でまだ閉じていないので、以下のコードは画像全体を埋めるものではないと思います。

シェイプを閉じて青色で正しく塗りつぶすにはどうすればよいですか?

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

私の問題は、手の中に輪郭が検出されていることだと思います。逆のアプローチを試してみてください。周囲を満たしてから反転してください。 –

+0

どのように周囲を埋めるのですか? –

+2

緑のような明瞭な色を使って輪郭だけを塗りつぶします(塗りつぶされません)。次に、左上隅にシードされたcvFloodFillを使用して、青で塗りつぶします。その後、画像を歩き、青色のピクセルを黒色と黒色または緑色のピクセルで青色に置き換えます。 –

答えて

6

あなたの問題を解決するために、あなただけの外側の輪郭を検出する必要があります。これを行うことで、1つの輪郭しか得られず、色で塗りつぶすことができます。

findContours(canny_output, contours, hierarchy, Imgproc.RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 
関連する問題