Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

How to make edges of OpenCV skin detection output “smooth”?

I did skin detection with OpenCV, it is based on HSV color space:

cvtColor(src, hsv, CV_BGR2HSV);

inRange(hsv, Scalar(0, 48, 80), Scalar(20, 255, 255), bw);

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 output = Mat::zeros(src.size(), CV_8UC1);

drawContours(output, contours, s, Scalar(255), -1, 8, hierarchy, 0, Point());

It finds the contour of the skin correctly, however, the edge of the output is not "smooth". Is there a way I can smooth the output contour (Please note "contours" is a vector of coordinates of the contour)?

I want to "smooth" the output based on coordinates or black/white image, not by means of algorithms like "image blur". Any suggestions? It'll be kind if you show me some OpenCV codes.

Original Image Program output and desired output