11
青く塗りつぶされた手を出力したいが、間違った出力を得たい。入力画像、不適切な出力画像、およびコードを以下に示します。OpenCVシェイプを閉じて塗りつぶす
画像が右境界でまだ閉じていないので、以下のコードは画像全体を埋めるものではないと思います。
シェイプを閉じて青色で正しく塗りつぶすにはどうすればよいですか?
#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);
}
私の問題は、手の中に輪郭が検出されていることだと思います。逆のアプローチを試してみてください。周囲を満たしてから反転してください。 –
どのように周囲を埋めるのですか? –
緑のような明瞭な色を使って輪郭だけを塗りつぶします(塗りつぶされません)。次に、左上隅にシードされたcvFloodFillを使用して、青で塗りつぶします。その後、画像を歩き、青色のピクセルを黒色と黒色または緑色のピクセルで青色に置き換えます。 –