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

asked 2016-12-14 03:07:16 -0600

liuzhiyuan1225 gravatar image

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

edit retag flag offensive close merge delete

Comments

blur() the inRange() output, then threshold() again.

berak gravatar imageberak ( 2016-12-14 03:23:18 -0600 )edit
1

maybe this will be useful

sturkmen gravatar imagesturkmen ( 2016-12-14 04:39:59 -0600 )edit