私はいくつかの肌検出を行ってきましたが、滑らかな検出はできません。下の画像には、下に添付されているコードを使用した入力(左)と出力(右)が含まれています。さて、所望の出力は、一番下の画像(エッジで滑らかで、内部に穴がない画像)であったはずです。どのようにこの出力を達成するのですか?開始する場所のサンプルコードは大きな助けになるでしょう。OpenCVスキン検出
入力(左)と誤った出力(右):
所望の出力:
コードIncorect出力を生成する:
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main(){
Mat src = imread("qq.jpg");
if (src.empty())
return -1;
blur(src, src, Size(3,3));
Mat hsv;
cvtColor(src, hsv, CV_BGR2HSV);
Mat bw;
inRange(hsv, Scalar(0, 10, 60), Scalar(20, 150, 255), bw);
imshow("src", src);
imshow("dst", bw);
waitKey(0);
return 0;
}
変更されたコード(アスターの提案): (問題は今:?この引き分けはフィルパラメータで輪郭を設立した後、-1方法drawContours
を使用して、どのように出力を滑らかん)
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int findBiggestContour(vector<vector<Point> >);
int main(){
Mat src = imread("qq.jpg");
if (src.empty())
return -1;
blur(src, src, Size(3,3));
Mat hsv;
cvtColor(src, hsv, CV_BGR2HSV);
Mat bw;
inRange(hsv, Scalar(0, 10, 60), Scalar(20, 150, 255), bw);
imshow("src", src);
imshow("dst", bw);
Mat canny_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(bw, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
int s = findBiggestContour(contours);
Mat drawing = Mat::zeros(src.size(), CV_8UC1);
drawContours(drawing, contours, s, Scalar(255), -1, 8, hierarchy, 0, Point());
imshow("drw", drawing);
waitKey(0);
return 0;
}
int findBiggestContour(vector<vector<Point> > contours){
int indexOfBiggestContour = -1;
int sizeOfBiggestContour = 0;
for (int i = 0; i < contours.size(); i++){
if(contours[i].size() > sizeOfBiggestContour){
sizeOfBiggestContour = contours[i].size();
indexOfBiggestContour = i;
}
}
return indexOfBiggestContour;
}
ありがとうございました!私は目的の出力に近い出力を得ました。私は出力の端をどのようにスムーズにすることができるか尋ねることができますか? –
スムージングやブラーリングをお試しください。 OpenCVにはこれらの機能があります。 – ArtemStorozhuk
pyrMeanShiftFiltering()関数を使って、より滑らかに見えるようにしました。 –