C++下使用OpenCV实现人脸检测

 

没有安装OpenCV的可以找个教程安装一下,然后安装一下visual studio2015或2017

 

人脸识别主要有三个步骤:

  1. 人脸图像采集及检测
  2. 人脸图像预处理
  3. 人脸图像特征提取以及匹配与识别

以下代码实现了读取本地图像,进行人脸检测

#include 
#include "stdafx.h"
#include 
#include 



using namespace std;
using namespace cv;

int main()
{
	Mat image, image_gray;       //定义两个Mat变量,用于存储每一帧的图像

	image = imread("../test.jpg");
	imshow("原图", image);

	//waitKey(0);

	cvtColor(image, image_gray, CV_BGR2GRAY);   //转为灰度图
	equalizeHist(image_gray, image_gray);       //直发图均化,增强对比度方便处理

	CascadeClassifier eye_Classifier;            //载入分类器
	CascadeClassifier face_cascade;              //载入分类器

	
	//加载分类训练器,OpenCV官方文档的xml文档,可以直接调用
	//我的xml的路径D:\OpenCV\opencv\build\etc\haarcascades  

	if (!eye_Classifier.load("./haarcascade_eye.xml"))    //把xml文档复制到了当前项目的路径下
	{
		cout << "导入haarcascade_eye.xml时出错 !" << endl;
		return 0;

	}

	if (!face_cascade.load("./haarcascade_frontalface_alt.xml"))    //把xml文档复制到了当前项目的路径下
	{
		cout << "导入haarcascade_frontalface_alt.xml时出错 !" << endl;
		return 0;

	}


	//vector 是个类模板 需要提供明确的模板实参  vector则是个确定的类 模板的实例化
	
	vector eyeRect;
	vector faceRect;
	

	//检测眼睛的位置
	eye_Classifier.detectMultiScale(image_gray,eyeRect,1.1,2,0 | CV_HAAR_SCALE_IMAGE,Size(30,30));
	for (size_t eyeIdx = 0;eyeIdx < eyeRect.size();eyeIdx++) 
	{

		rectangle(image, eyeRect[eyeIdx], Scalar(0, 0, 255));    //用矩形画出检测到的眼睛的位置

	}
	/*
	CV_WRAP virtual void detectMultiScale(
								   const Mat& image,  
                                   CV_OUT vector& objects,  
                                   double scaleFactor=1.1,  
                                   int minNeighbors=3, int flags=0,  
                                   Size minSize=Size(),  
                                   Size maxSize=Size() 
								   );  


	各参数含义:
	const Mat& image: 需要被检测的图像(灰度图)
	vector& objects: 保存被检测出的人脸位置坐标序列
	double scaleFactor: 每次图片缩放的比例
	int minNeighbors: 每一个人脸至少要检测到多少次才算是真的人脸
	int flags: 决定是缩放分类器来检测,还是缩放图像
	Size(): 表示人脸的最大最小尺寸
	
	*/

	//检测关于脸部的位置

	face_cascade.detectMultiScale(image_gray, faceRect, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
	for (size_t i = 0; i < faceRect.size(); i++)
	{
		rectangle(image, faceRect[i], Scalar(0, 0, 255));           //用矩形画出检测到脸部的位置
	}

	imshow("人脸识别",image);         //显示当前
	waitKey(0);


	return 0;


}

 结果是这样子的

出现的问题以及解决方法

C++下使用OpenCV实现人脸检测_第1张图片

抛出了异常

 

出现上图所示的异常时,建议检查以下几点

  1. OpenCV是否加入到环境变量中
  2. visual studio中配置是否正确 (网上看教程再检查检查)
  3. 图片路径以及图片名

 

我是第三种情况,图片找不到了,建议写成 image = imread("../test.jpg");

../是表示当前路径的上一级,主要看图片路径和当前项目路径的关系

若是在同一级路径 就写为"./test.jpg"

源码下载:https://download.csdn.net/download/qq_36290227/10740563

参考博文:https://blog.csdn.net/zuidao3105/article/details/79346591

 

你可能感兴趣的:(C++,OpenCV)