怎么用opencv自带的分类器进行人脸识别

怎么用opencv自带的分类器进行人脸识别,第1张

(安装opcv环境)

代码:

#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的界面上显示一些开关什么的,就行了。纵观全过程,环节和技术门类挺多呢,非高手无法实现


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8130949.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存