修改自opencv的adaptiveskindetector.cpp,去掉了复杂的命令行参数输入,只需要一个网络摄像头即可运行。
原理方面大致看了下,主要还是利用HSV空间的色调信息。
效果还可以,但似乎对于白色,尤其是乳白色的墙壁,壁板等检测效果较差。
这是在这里公布的第一个小东西,尽量一周更新一个,基本都会附带源代码(C++, VS2008)
皮肤检测
/* ********************************************************************** */
/* adaptive skin detection
modified from opencv's adaptiveskindetector.cpp
opencv2.0 is required
welcome to visit my website: http://yangyangwenjia.appspot.com/
*/
/* ********************************************************************** */
#include < iostream >
#include < cstdio >
#include < cstring >
#include < ctime >
#include < cvaux.h >
#include < highgui.h >
int main( int argc, char ** argv )
{
CvAdaptiveSkinDetector filter( 1 , CvAdaptiveSkinDetector::MORPHING_METHOD_ERODE_DILATE);
int camWidth = 640 ;
int camHeight = 480 ;
IplImage * maskImg = cvCreateImage( cvSize(camWidth, camHeight), IPL_DEPTH_8U, 1 );
IplImage * skinImg = cvCreateImage( cvSize(camWidth, camHeight), IPL_DEPTH_8U, 3 );
cvNamedWindow( " skin " , CV_WINDOW_AUTOSIZE);
cvNamedWindow( " source " , CV_WINDOW_AUTOSIZE);
CvCapture * capture = cvCaptureFromCAM( 0 );
IplImage * frame = 0 ;
for (;;)
{
cvZero(skinImg);
frame = cvQueryFrame( capture );
if ( ! frame )
break ;
filter.process(frame, maskImg); // process the frame
cvCopy(frame,skinImg,maskImg);
cvShowImage ( " skin " , skinImg);
cvShowImage ( " source " , frame);
if (cvWaitKey( 1 ) == 27 )
break ;
}
cvReleaseImage( & skinImg);
cvReleaseImage( & maskImg);
cvReleaseCapture( & capture );
cvDestroyWindow( " skin " );
cvDestroyWindow( " source " );
return 0 ;
}
hope you find it useful~