opencv 2.4.9+vs2013 人脸识别环境搭建,眼睛,鼻子,嘴巴等 摄像头读取和显示
来源:互联网 发布:广东玉米数据网 编辑:程序博客网 时间:2024/05/01 17:52
一 ,环境设置
工具:
- opencv2.4.9地址:https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.9/opencv-2.4.9.exe/download
- 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);
- opencv 2.4.9+vs2013 人脸识别环境搭建,眼睛,鼻子,嘴巴等 摄像头读取和显示
- opencv 人脸识别 眼睛识别 鼻子嘴巴等等的分类器haarcascade
- 基于OpenCV harr级联分类器的人脸及眼睛、鼻子、嘴巴检测程序
- 能检测出鼻子,眼睛,嘴巴的opencv程序
- 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)
- 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】
- 利用opencv库函数检测人脸、眼睛以及鼻子等区域
- 【OpenCV】检测人脸、眼睛、鼻子、耳朵、嘴
- [opencv]识别人脸和眼睛
- opencv--读取摄像头识别人脸并跟踪
- 基于OpenCV读取摄像头进行人脸检测和人脸识别
- 基于OpenCV读取摄像头进行人脸检测和人脸识别
- 基于OpenCV读取摄像头进行人脸检测和人脸识别
- 基于OpenCV读取摄像头进行人脸检测和人脸识别
- 基于OpenCV读取摄像头进行人脸检测和人脸识别
- Opencv+vs2013环境搭建
- VS2013+OpenCV环境搭建
- opencv 2.4.9 摄像头读取
- C语言实现单链表的创建和添加结点
- [二分+最大流] BZOJ1532: [POI2005]Kos-Dicing
- Spring的三种注入方式:
- VS中double的数据存储
- 词向量源码解析:(6.2)fasttext源码解析之文本分类1
- opencv 2.4.9+vs2013 人脸识别环境搭建,眼睛,鼻子,嘴巴等 摄像头读取和显示
- VC++/halcon入门之数据结构
- 数组,json的去重
- 利用 WireShark 深入调试网络请求
- top和ps取长补短
- insert语句 foreach 、虚表的使用 mybatis
- 写linux驱动程序的步骤
- 生成pdf可编辑也是醉了
- 9月28日云栖精选夜读:阿里云MaxCompute澳大利亚开服_“领跑”人工智能市场