OpenCV Skin Detection

Я делал некоторые определения кожи, но не могу получить гладкое. Изображение ниже содержит ввод (слева) и вывод (справа) с использованием кода, также прикрепленного ниже. Теперь желаемый результат должен быть самым нижним изображением (гладким по краям и не имеющим отверстий внутри). Как мне добиться этого результата? Пример кода о том, с чего начать, будет очень полезен.

Вход (слева) и неверный вывод (справа):

введите описание изображения здесь

Желаемый результат:

введите описание изображения здесь

Код для генерации выхода 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;
}

Модифицированный код (после предложения Астора):
(проблема сейчас в том, как сгладить вывод?)

#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;
}

10

Решение

Вы должны использовать findContours определить самый большой контур и после этого нарисовать контур с параметром заполнения -1, используя метод drawContours, Вот полезная ссылка: http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html

10

Другие решения

Чтобы улучшить плавность вывода или, другими словами, уменьшить черные дыры в обнаруженной области, попробуйте выполнить морфологические операции с результирующим изображением.
Следующая документация объясняет функции эрозии и расширения в opencv.
http://docs.opencv.org/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html

1

По вопросам рекламы [email protected]