一个超精准的肤色检测!!
修改自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
;
}