opencv 2.4.9+vs2013 人脸识别环境搭建,眼睛,鼻子,嘴巴等 摄像头读取和显示

一 ,环境设置  

      工具: 

      步骤:

     1.   安装opencv2.4.9,解压,请务必记住自己解压的路径。以我自己的路径为例D:\

       

     2.  配置环境变量

         (1)系统变量 Path:添加 D:\opencv2.4.9\opencv\build\x86\vc12\bin

      (2)用户变量: 添加opencv变量值 D:\opencv2.4.9\opencv\build

           添加PATH变量(有就不需要添加,但是值需要添加)值D:\opencv2.4.9\opencv\build\x86\vc12\bin

      说明:不管你系统是32位还是64位,路径目录均选择X86,因为编译都是使用32位编译;如果选用X64,则程序运行时候会出错。

     

3.  新建visual C项目

    新建 visual C++项目,如下图所示,项目选项注意:如下图。

    

   

    

   4.  工程目录的配置(Debug)

      找到属性管理器     视图---其他窗口----属性管理器

        如果找不到,请安装下图方法找到。双击Debug|Win32打开如下窗口,

    

   设置如下:(下图红框项为设置项)

   1、包含目录:(VC++目录)

        D:\opencv2.4.9\opencv\build\include

        D:\opencv2.4.9\opencv\build\include\opencv

        D:\opencv2.4.9\opencv\build\include\opencv2

  2、库目录:(VC++目录)D:\opencv2.4.9\opencv\build\x86\vc12\lib

  3、连接器->输入->附加依赖项:

  

opencv_ml249d.lib

opencv_calib3d249d.lib

opencv_contrib249d.lib

opencv_core249d.lib

opencv_features2d249d.lib

opencv_flann249d.lib

opencv_gpu249d.lib

opencv_highgui249d.lib

opencv_imgproc249d.lib

opencv_legacy249d.lib

opencv_objdetect249d.lib

opencv_ts249d.lib

opencv_video249d.lib

opencv_nonfree249d.lib

opencv_ocl249d.lib

opencv_photo249d.lib

opencv_stitching249d.lib

opencv_superres249d.lib

opencv_videostab249d.lib

其实以上都是D:\Program Files\opencv\build\x86\vc12\lib下所有的lib文件,你会发现,有的后面带上d,有的没有d,这是因为Debug的就有d,Release则没有d。


 




5.  工程目录的配置(Release)

    其他与Debug一样,只是连接器->输入->附加依赖项不一样,设置如下:

opencv_objdetect249.lib

opencv_ts249.lib

opencv_video249.lib

opencv_nonfree249.lib

opencv_ocl249.lib

opencv_photo249.lib

opencv_stitching249.lib

opencv_superres249.lib

opencv_videostab249.lib

opencv_calib3d249.lib

opencv_contrib249.lib

opencv_core249.lib

opencv_features2d249.lib

opencv_flann249.lib

opencv_gpu249.lib

opencv_highgui249.lib

opencv_imgproc249.lib

opencv_legacy249.lib

opencv_ml249.lib


6.  测试代码

   解决方案资源管理器-----源文件-----右键-----添加---新建项---写代码


二 人脸识别,

   以下包含三个部分: 摄像头读取和显示,人脸识别单张图像,人脸识别视频形式

1.   读取摄像头和显示:

int main( int argc, char** argv ) {   
    //int i=0;  
    cvNamedWindow( "Example2_9", CV_WINDOW_AUTOSIZE );  
    CvCapture* capture;  
    capture = cvCreateCameraCapture(0);  
    assert( capture != NULL );  
    IplImage* frame;  
    //frame = cvQueryFrame( capture );  //先读一次规避掉第一帧  
    while(1) {  
        frame = cvQueryFrame( capture );  
        if( !frame ) break;         //如果程序不能读取摄像头,那么将此句删除或加个判断即采用注释掉的i语句又或者在while前读一次  
        //if( !frame&i>0 ) break;  
        //if(i>0)  
        cvShowImage( "Example2_9", frame );  
        char c = cvWaitKey(10);  
        if( c == 27 ) break;  
        //i++;  
    }  
    cvReleaseCapture( &capture );  
    cvDestroyWindow( "Example2_9" );  
    return 0;  
}  
//在运行书上第2章练习2运动跟踪时,删掉掉if语句不能运行,加个判断可以  

2.  人脸识别

OpenCV_人脸检测

利用OpenCV自带的人脸识别库haarcascade_frontalface_alt.xml进行人脸识别测试


Opencv自带了几个训练好的分类器,我们可以直接调用测试,分类器的目录在opencv的安装目录opencv246\opencv\sources\data\haarcascades\文件夹下

关于人脸检测有四个分类器



这里我们采用haarcascade_frontalface_alt.xml进行人脸识别测试。

调用代码如下:


#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>  
using namespace std;  
  
  
static CvMemStorage* storage = 0;  
static CvHaarClassifierCascade* cascade = 0;  
  
  
void detect_and_draw( IplImage* image );  
  
  
const char* cascade_name ="D:/opencv2.4.9/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml"; //opencv自带人脸识别训练结果  
/* "haarcascade_profileface.xml";*/  
  
  
int main()  
{  
   CvCapture* capture = 0;  
  
  
   cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );//加载opencv自带人脸识别训练结果  
  
  
  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);  
  
   cvNamedWindow( "result", 1 );  
  
   const char* filename = "people.jpg";  
   IplImage* image = cvLoadImage(filename ); //加载图像  
   if( image )  
 {  
 detect_and_draw( image );  
 cvWaitKey(0);  
 cvReleaseImage( &image );  
 }  
  
  
 cvDestroyWindow("result");  
 cvWaitKey(0);  
 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 = 0; i < (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 );  
}   

   2.  人脸识别 ———视频

#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>  
using namespace std;


static CvMemStorage* storage = 0;
static CvHaarClassifierCascade* cascade = 0;


void detect_and_draw(IplImage* image);


const char* cascade_name = "D:/opencv2.4.9/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml"; //opencv×Ô´øÈËÁ³Ê¶±ðѵÁ·½á¹û  
/* "haarcascade_profileface.xml";*/


int main()
{
	CvCapture* capture;
	capture = cvCreateCameraCapture(0);
	cvNamedWindow("face", 1);

	cascade = (CvHaarClassifierCascade*)cvLoad(cascade_name, 0, 0, 0);//¼ÓÔØopencv×Ô´øÈËÁ³Ê¶±ðѵÁ·½á¹û  


	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);
	assert(capture != NULL);
	
	IplImage* frame;
	frame = cvQueryFrame( capture );  //ÏȶÁÒ»´Î¹æ±ÜµôµÚÒ»Ö¡  
	while (1) {
		frame = cvQueryFrame(capture);
		detect_and_draw(frame);
		//if (!frame) break;         //Èç¹û³ÌÐò²»ÄܶÁÈ¡ÉãÏñÍ·£¬ÄÇô½«´Ë¾äɾ³ý»ò¼Ó¸öÅжϼ´²ÉÓÃ×¢Ê͵ôµÄiÓï¾äÓÖ»òÕßÔÚwhileÇ°¶ÁÒ»´Î  
		//if( !frame&i>0 ) break;  
		//if(i>0)  
		cvShowImage("face", frame);
		char c = cvWaitKey(10);
		if (c == 27) break;
		//i++;  
	}
	cvReleaseCapture(&capture);
	cvDestroyWindow("face");
	cvWaitKey(0);
	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 = 0; i < (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);
}


注释:

const char* cascade_name="haarcascade_frontalface_alt2.xml";//分类器的名称
const char* cascade_name1="haarcascade_eye_tree_eyeglasses.xml";//分类器的名称
const char* cascade_name2="haarcascade_frontalface_alt_tree.xml";//分类器的名称
const char* cascade_name3="haarcascade_mcs_mouth.xml";//分类器的名称
const char* cascade_name4="haarcascade_mcs_nose.xml";//分类器的名称

这是不同的分类器,你可以在你安装的OpenCV中找到。如D:\Program Files\OpenCV2.0\vs2008\data\haarcascades

不同分类器能够帮助你识别不同的部分,如眼睛,鼻子和嘴,更多的需要自己去探索吧。

注释:

  把圆形转换成矩形:

pt1.x = r->x*scale; 
pt2.x = (r->x+r->width)*scale; 
pt1.y = r->y*scale; 
pt2.y = (r->y+r->height)*scale; 
cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 ); 

pt1 : 矩形左上角

pt2:  矩形右下角

只需把  

cvCircle(img, center, radius, colors[i % 8], 3, 8, 0); //用圆形圈出人脸区域  

换成

cvRectangle(img, cvPoint(r->x*scale, r->y*scale), cvPoint((r->x + r->width)*scale, (r->x + r->height)*scale), cvScalar(0, 0, 255), 2, 8, 0);











  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值