代码:
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <time.h>
#include <ctype.h>
#ifdef _EiC
#define WIN32
#endif
static CvMemStorage* storage = 0
static CvHaarClassifierCascade* cascade = 0
void detect_and_draw( IplImage* image )
const char* cascade_name =
"haarcascade_frontalface_alt.xml"
/*"haarcascade_profileface.xml"*/
int main( int argc, char** argv )
{
CvCapture* capture = 0
IplImage *frame, *frame_copy = 0
int optlen = strlen("--cascade=")
const char* input_name
if( argc >1 &&strncmp( argv[1], "--cascade=", optlen ) == 0 )
{
cascade_name = argv[1] + optlen
input_name = argc >2 ? argv[2] : 0
}
else
{
cascade_name = "../../data/haarcascades/haarcascade_frontalface_alt2.xml"
//opencv装好后haarcascade_frontalface_alt2.xml的路径,
//也可以把这个文件拷到你的工程文件夹下然后不用写路径名cascade_name= "haarcascade_frontalface_alt2.xml"
//或者cascade_name ="C:\\Program Files\\OpenCV\\data\\haarcascades\\haarcascade_frontalface_alt2.xml"
input_name = argc >1 ? argv[1] : 0
}
cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 )
if( !cascade )
{
fprintf( stderr, "ERROR: Could not load classifier cascade\n" )
fprintf( stderr,
"Usage: facedetect --cascade=\"<cascade_path>\" [filename|camera_index]\n" )
return -1
}
storage = cvCreateMemStorage(0)
if( !input_name || (isdigit(input_name[0]) &&input_name[1] == '\0') )
capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' )
else
capture = cvCaptureFromAVI( input_name )
cvNamedWindow( "result", 1 )
if( capture )
{
for()
{
if( !cvGrabFrame( capture ))
break
frame = cvRetrieveFrame( capture )
if( !frame )
break
if( !frame_copy )
frame_copy = cvCreateImage( cvSize(frame->width,frame->height),
IPL_DEPTH_8U, frame->nChannels )
if( frame->origin == IPL_ORIGIN_TL )
cvCopy( frame, frame_copy, 0 )
else
cvFlip( frame, frame_copy, 0 )
detect_and_draw( frame_copy )
if( cvWaitKey( 10 ) >= 0 )
break
}
cvReleaseImage( &frame_copy )
cvReleaseCapture( &capture )
}
else
{
const char* filename = input_name ? input_name : (char*)"lena.jpg"
IplImage* image = cvLoadImage( filename, 1 )
if( image )
{
detect_and_draw( image )
cvWaitKey(0)
cvReleaseImage( &image )
}
else
{
/* assume it is a text file containing the
list of the image filenames to be processed - one per line */
FILE* f = fopen( filename, "rt" )
if( f )
{
char buf[1000+1]
while( fgets( buf, 1000, f ) )
{
int len = (int)strlen(buf)
while( len >0 &&isspace(buf[len-1]) )
len--
buf[len] = '\0'
image = cvLoadImage( buf, 1 )
if( image )
{
detect_and_draw( image )
cvWaitKey(0)
cvReleaseImage( &image )
}
}
fclose(f)
}
}
}
cvDestroyWindow("result")
return 0
}
void detect_and_draw( IplImage* img )
{
static CvScalar colors[] =
{
{{0,0,255}},
{{0,128,255}},
{{0,255,255}},
{{0,255,0}},
{{255,128,0}},
{{255,255,0}},
{{255,0,0}},
{{255,0,255}}
}
double scale = 1.3
IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 )
IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale),
cvRound (img->height/scale)),
8, 1 )
int i
cvCvtColor( img, gray, CV_BGR2GRAY )
cvResize( gray, small_img, CV_INTER_LINEAR )
cvEqualizeHist( small_img, small_img )
cvClearMemStorage( storage )
if( cascade )
{
double t = (double)cvGetTickCount()
CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,
1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,
cvSize(30, 30) )
t = (double)cvGetTickCount() - t
printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) )
for( i = 0i <(faces ? faces->total : 0)i++ )
{
CvRect* r = (CvRect*)cvGetSeqElem( faces, i )
CvPoint center
int radius
center.x = cvRound((r->x + r->width*0.5)*scale)
center.y = cvRound((r->y + r->height*0.5)*scale)
radius = cvRound((r->width + r->height)*0.25*scale)
cvCircle( img, center, radius, colors[i%8], 3, 8, 0 )
}
}
cvShowImage( "result", img )
cvReleaseImage( &gray )
cvReleaseImage( &small_img )
}
然后按照程序的位置(看代码)放入训练好的xml:
haarcascade_frontalface_alt.xml和haarcascade_frontalface_alt2.xml这些网上可以搜到,楼主找不到可以问我要(QQ:1207643343)
其实挺麻烦的,需要的技术门类挺多呢。简短解说。现场一定有个服务器负责与各单元门设备(通常是485总线和modbus协议应该,我不是做这门禁的,只是工控这东西猜都能猜出来罢了。如果具备人脸识别那得是以太网TCP通讯,485和modbus肯定不行了)通讯。在这个服务器上安装上自己开发的(需要改变或者跟厂家协商,不然自己编的软件没法融入现有软件啊,协商一下,没准人家已经留有接口或者用的是OPC的话那福音就来了,省事得多)软件,此软件提供远程APP接入(我的做法是此软件做成H5,这样80端口web服务就可以访问了,很方便)。申请宽带和域名(不使用域名也可以,但是得申请到固定IP才行)。再编写个手机APP,APP通过域名就可以连接到服务器了(假如你用的web服务H5,技术,APP的编写就简单了,就是套个浏览器就完了),APP的界面上显示一些开关什么的,就行了。纵观全过程,环节和技术门类挺多呢,非高手无法实现欢迎分享,转载请注明来源:内存溢出
评论列表(0条)