| Beaglebone外围电路设计心得Opencv 无刷电机 
 开源人脸识别基本功能代码
 OpenCV这方面各项目开发国外已经很开源了,我们虚拟公司也参考和学习修改运用在修改调试过来的知反反复复了多少遍。
 
 一 如何使用OpenCV的人脸检测器检测到人脸:
 
 / /执行的输入图像上的人脸检测,使用给定的(Haar)级联。
 / /返回一个矩形,在给定的图像中检测到的区域。
 CvRect detectFaceInImage(IplImage *inputImg, CvHaarClassifierCascade* cascade)
 {
 / /最小脸的大小.
 CvSize minFeatureSize = cvSize(20, 20);
 / /只搜索一面.
 int flags = CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_DO_ROUGH_SEARCH;
 / /详细的搜索.
 float search_scale_factor = 1.1f;
 IplImage *detectImg;
 IplImage *greyImg = 0;
 CvMemStorage* storage;
 CvRect rc;
 double t;
 CvSeq* rects;
 CvSize size;
 int i, ms, nFaces;
 storage = cvCreateMemStorage(0);
 cvClearMemStorage( storage );
 
 / /如果图像是彩色的,使用的灰度图像的副本.
 detectImg = (IplImage*)inputImg;
 if (inputImg->nChannels > 1) {
 size = cvSize(inputImg->width, inputImg->height);
 greyImg = cvCreateImage(size, IPL_DEPTH_8U, 1 );
 cvCvtColor( inputImg, greyImg, CV_BGR2GRAY );
 detectImg = greyImg; // Use the greyscale image.
 }
 //检测的灰度图像中的所有面.
 t = (double)cvGetTickCount();
 rects = cvHaarDetectObjects( detectImg, cascade, storage,
 search_scale_factor, 3, flags, minFeatureSize);
 t = (double)cvGetTickCount() - t;
 ms = cvRound( t / ((double)cvGetTickFrequency() * 1000.0) );
 nFaces = rects->total;
 printf("Face Detection took %d ms and found %d objects\n", ms, nFaces);
 //获取第一个检测到的人脸(最大).
 if (nFaces > 0)
 rc = *(CvRect*)cvGetSeqElem( rects, 0 );
 else
 rc = cvRect(-1,-1,-1,-1); / /找不到的脸.
 if (greyImg)
 cvReleaseImage( &greyImg );
 cvReleaseMemStorage( &storage );
 // cvReleaseHaarClassifierCascade的(级联);
 return rc; / /返回发现最大的面,或(-1,-1,-1,-1).
 }
 // Haar的级联文件,使用的人脸检测.
 char *faceCascadeFilename = "haarcascade_frontalface_alt.xml";
 / /加载的HaarCascade分类器进行人脸检测.
 CvHaarClassifierCascade* faceCascade;
 faceCascade = (CvHaarClassifierCascade*)cvLoad(faceCascadeFilename, 0, 0, 0);
 if( !faceCascade ) {
 printf("Couldnt load Face detector '%s'\n", faceCascadeFilename);
 exit(1);
 }
 / /获取下一帧的摄像头.
 IplImage *inputImg = cvQueryFrame(camera);
 / /对输入图像执行面部检测,使用给定的(Haar)分类.
 CvRect faceRect = detectFaceInImage(inputImg, faceCascade);
 / /确保有效侦测到脸部.
 if (faceRect.width > 0) {
 printf("Detected a face at (%d,%d)!\n", faceRect.x, faceRect.y);
 }
 .... Use 'faceRect' and 'inputImg' ....
 //人脸检测程序完成时的资源cvReleaseHaarClassifierCascade(级联);
 
 
 二  如何进行预处理,人脸图像的人脸识别:
 / /无论是将图像转换为灰度,或使用现有的灰度图像.
 IplImage *imageGrey;
 if (imageSrc->nChannels == 3) {
 imageGrey = cvCreateImage( cvGetSize(imageSrc), IPL_DEPTH_8U, 1 );
 / /从RGB(实际上它是BGR)转换为灰度。
 cvCvtColor( imageSrc, imageGrey, CV_BGR2GRAY );
 }
 else {
 / /只使用输入图像,因为它已经是灰度.
 imageGrey = imageSrc;
 }
 / /调整的图像的大小是一致的大小,即使宽高比变化.
 IplImage *imageProcessed;
 imageProcessed = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);
 / /使图像具有固定大小.
 / / CV_INTER_CUBIC或CV_INTER_LINEAR的是良好的扩大,
 / //抽取伸缩CV_INTER_AREA是良好的,但糟糕的扩大.
 cvResize(imageGrey, imageProcessed, CV_INTER_LINEAR);
 / /给一个标准的亮度和对比度的图像.
 cvEqualizeHist(imageProcessed, imageProcessed);
 .....  Use 'imageProcessed' for Face Recognition ....
 if (imageGrey)
 cvReleaseImage(&imageGrey);
 if (imageProcessed)
 cvReleaseImage(&imageProcessed);
 
 三 实现离线瞄准:
 
 / /告诉PCA退出的时候它有足够的特征脸.
 CvTermCriteria calcLimit = cvTermCriteria( CV_TERMCRIT_ITER, nEigens, 1);
 / /计算平均图像,特征向量(特征脸)和特征(比率).
 cvCalcEigenObjects(nTrainFaces, (void*)faceImgArr, (void*)eigenVectArr,
 CV_EIGOBJ_NO_CALLBACK, 0, 0, &calcLimit,
 pAvgTrainImg, eigenValMat->data.fl);
 //标准化矩阵的特征值.
 cvNormalize(eigenValMat, eigenValMat, 1, 0, CV_L1, 0);
 / /每个training项目的PCA子空间上的图像.
 CvMat projectedTrainFaceMat = cvCreateMat( nTrainFaces, nEigens, CV_32FC1 );
 int offset = projectedTrainFaceMat->step / sizeof(float);
 for(int i=0; i<nTrainFaces; i++) {
 cvEigenDecomposite(faceImgArr, nEigens, eigenVectArr, 0, 0,
 pAvgTrainImg, projectedTrainFaceMat->data.fl + i*offset);
 }
 
 
 
 四 实现从相机的实时识别:
 / /获取下一个摄像机框架。等待,直到下一帧是准备好了,
 / /提供直接访问它,所以不要修改或释放返回的图像!
 / /将自动初始化摄像头,在第一帧上.
 IplImage* getCameraFrame(CvCapture* &camera)
 {
 IplImage *frame;
 int w, h;
 / /如果相机没有被初始化,然后打开它.
 if (!camera) {
 printf("Acessing the camera ...\n");
 camera = cvCreateCameraCapture( 0 );
 if (!camera) {
 printf("Couldn't access the camera.\n");
 exit(1);
 }
 / /尝试设置相机的分辨率为320×240.
 cvSetCaptureProperty(camera, CV_CAP_PROP_FRAME_WIDTH, 320);
 cvSetCaptureProperty(camera, CV_CAP_PROP_FRAME_HEIGHT, 240);
 / /获取第一帧,以确保相机初始化.
 frame = cvQueryFrame( camera );
 if (frame) {
 w = frame->width;
 h = frame->height;
 printf("Got the camera at %dx%d resolution.\n", w, h);
 }
 / /等待一点点,使相机可以自动调节其亮度.
 Sleep(1000); / /(以毫秒为单位)
 }
 / /等待下一个摄像机的帧准备就绪,然后抓住它.
 frame = cvQueryFrame( camera );
 if (!frame) {
 printf("Couldn't grab a camera frame.\n");
 exit(1);
 }
 return frame;
 }
 CvCapture* camera = 0; / /摄像头装置.
 while ( cvWaitKey(10) != 27 ) { // 退出“ "Escape"的关键.
 IplImage *frame = getCameraFrame(camera);
 ...
 }
 // /相机.
 cvReleaseCapture( &camera );
 
 |