visual studo 2022中使用Opencv人脸检测

1.关于.xml文件位置,Opencv下载和导入Visual studio 2022

https://blog.csdn.net/Keep_Trying_Go/article/details/124902276

关于.xml位置

关于使用python中的opencv实现人脸识别:
https://mydreamambitious.blog.csdn.net/article/details/124851743

2.一张图片的测试

这里根据自己的需要加载相应的.xml文件

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//haarcascade_frontalcatface.xml
//.xml文件的位置
String filename = "E:\\conda_3\\PyCharm\\OpenCV\\FaceDetect\\CascadeClassifer\\haarcascade_frontalface_alt.xml";
//图片的位置
String facefile = "E:\\conda_3\\PyCharm\\OpenCV\\FaceDetect\\images\\face1.jpg";
CascadeClassifier face_classifiler;

int main() {
//加载人脸识别.xml文件
	if (!face_classifiler.load(filename)) {
		printf("The CascadeClassifier load fail!");
		return 0;
	}
	Mat img = imread(facefile);
	if (img.empty()) {
		printf("The picture read fail!");
		return 0;
	}

	Mat gray;
	cvtColor(img, gray, COLOR_BGR2GRAY);
//equalizeHist直方图均衡化,,用于提高图像的质量
	equalizeHist(gray, gray);

	vector<Rect>faces;

	//输入图像 vector<Rect>& objects 缩放比例 检测次数 检测方法 图像大小
	face_classifiler.detectMultiScale(gray, faces, 1.2, 3, 0, Size(24, 24));
	for (size_t t = 0; t < faces.size(); t++) {
		rectangle(img, faces[static_cast<int>(t)], Scalar(255, 255, 0), 2, 8, 0);
		cv::Point locate;
		locate.x = (float)(faces[static_cast<int>(t)].x + faces[static_cast<int>(t)].width / 4);
		locate.y = (float)(faces[static_cast<int>(t)].y - 10);
		putText(img, "Person", locate, FONT_HERSHEY_SIMPLEX,
			1.2, (0, 255, 0), 2, 8);
	}

	imshow("face", img);
	waitKey(0);

	return 0;
}


这个地方的坐标表示方式要注意。

上面相关函数的解释:


detectMultiScale(InputArray image,
	CV_OUT std::vector<Rect>& objects,
		double scaleFactor = 1.1,
		int minNeighbors = 3, int flags = 0,
		Size minSize = Size(),
		Size maxSize = Size() );
参数说明:
    参数1:image–待检测图片,一般为灰度图像加快检测速度;
	参数2:objects–被检测物体的矩形框向量组;为输出量,如人脸检测矩阵Mat
	参数3:scaleFactor–表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;一般设置为1.1
	参数4:minNeighbors–表示构成检测目标的相邻矩形的最小个数(默认为3个)。
	如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
	如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,
	这种设定值一般用在用户自定义对检测结果的组合程序上;
	参数5:flags–要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域;
	参数6、7:minSize和maxSize用来限制得到的目标区域的范围。也就是我本次训练得到实际项目尺寸大小
		

		rectangle(InputOutputArray img, Rect rec,
                          const Scalar& color, int thickness = 1,
                          int lineType = LINE_8, int shift = 0)
		参数说明: 
			img 图像
			pt1 矩形的一个顶点
			pt2 矩形对角线上的另一个顶点
			color 线条颜色 (RGB) 或亮度(灰度图像 )(grayscale image)。
			thickness 组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。
			line_type 线条的类型。见cvLine的描述
			shift 坐标点的小数点位数。
		

		putText( InputOutputArray img, const String& text, Point org,
                         int fontFace, double fontScale, Scalar color,
                         int thickness = 1, int lineType = LINE_8,
                         bool bottomLeftOrigin = false );
		参数说明:
			img:写文本的图像
			text:要绘制的文本字符串
			org:文本位置
			fontFace:字体类型
			fontScalar:字体大小
			color:文本颜色
			thickness:绘制文本线条的厚度
			lineType:线类型
			bottomLeftOrigin :当为true时,图像数据源位于左下角,为false时位于右上角
		

3.实时检测

这里根据自己的需要加载相应的.xml文件

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//haarcascade_frontalcatface.xml
//opencv_world455d.lib
//E:\Visual studio 2019\Opencv\opencv\build\include
//E:\Visual studio 2019\Opencv\opencv\build\x64\vc15\lib
String filename = "E:\\conda_3\\PyCharm\\OpenCV\\FaceDetect\\CascadeClassifer\\haarcascade_frontalface_alt.xml";
CascadeClassifier face_classifiler;

int main() {
	if (!face_classifiler.load(filename)) {
		printf("The CascadeClassifier load fail!");
		return 0;
	}
//打开摄像头实时检测
	namedWindow("face",WINDOW_AUTOSIZE);
	VideoCapture capture(0);
	Mat frame;
	Mat gray;
	while (capture.read(frame)) {
		cvtColor(frame, gray, COLOR_BGR2GRAY);
		//equalizeHist直方图均衡化,,用于提高图像的质量
		equalizeHist(gray, gray);
		vector<Rect>faces;
		//输入图像 vector<Rect>& objects 缩放比例 检测次数 检测方法 图像大小
		face_classifiler.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30,30));
		for (size_t t = 0; t < faces.size(); t++) {
	
			rectangle(frame, faces[static_cast<int>(t)], Scalar(255, 255, 0), 2, 8, 0);
	
			
			cv::Point locate;
			locate.x = (float)(faces[static_cast<int>(t)].x + faces[static_cast<int>(t)].width / 4);
			locate.y = (float)(faces[static_cast<int>(t)].y - 10);
			putText(frame, "Person", locate, FONT_HERSHEY_SIMPLEX,
				1.2, (0, 0, 255), 2, 8);
		}
		imshow("face", frame);
		if (waitKey(10) == 27) {
			break;
		}
	}
	capture.release();
	destroyAllWindows();

	return 0;
}

4.实时人眼检测

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//haarcascade_frontalcatface.xml
//opencv_world455d.lib
//E:\Visual studio 2019\Opencv\opencv\build\include
//E:\Visual studio 2019\Opencv\opencv\build\x64\vc15\lib
String filename = "E:\\conda_3\\PyCharm\\OpenCV\\FaceDetect\\CascadeClassifer\\haarcascade_frontalface_alt.xml";
String filename_eye = "E:\\conda_3\\PyCharm\\OpenCV\\FaceDetect\\CascadeClassifer\\haarcascade_eye.xml";
CascadeClassifier face_classifiler;
CascadeClassifier eye_detect;

int main() {
	if (!face_classifiler.load(filename)) {
		printf("The CascadeClassifier load fail!");
		return 0;
	}
	if (!eye_detect.load(filename_eye)) {
		printf("The CascadeClassifier load fail!");
		return 0;
	}
	//打开摄像头实时检测
	namedWindow("face", WINDOW_AUTOSIZE);
	VideoCapture capture(0);
	Mat frame;
	Mat gray;
	while (capture.read(frame)) {
		cvtColor(frame, gray, COLOR_BGR2GRAY);
		//equalizeHist直方图均衡化,,用于提高图像的质量
		equalizeHist(gray, gray);
		vector<Rect>faces;
		vector<Rect>eyes;
		//输入图像 vector<Rect>& objects 缩放比例 检测次数 检测方法 图像大小
		face_classifiler.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30, 30));
		for (size_t t = 0; t < faces.size(); t++) {
			rectangle(frame, faces[static_cast<int>(t)], Scalar(255, 255, 0), 2, 8, 0);
			cv::Point locate;
			locate.x = (float)(faces[static_cast<int>(t)].x + faces[static_cast<int>(t)].width / 4);
			locate.y = (float)(faces[static_cast<int>(t)].y - 10);
			putText(frame, "Person", locate, FONT_HERSHEY_SIMPLEX,
				1.2, (0, 0, 255), 2, 8);


			//首先在找到人脸的基础上进行人眼检测
			Mat eyeLocate = frame(faces[static_cast<int>(t)]);
			eye_detect.detectMultiScale(eyeLocate, eyes, 1.2, 10, 0, Size(20, 20));
			for (size_t s = 0; s < eyes.size(); s++) {
				Rect rect;
				rect.x = faces[static_cast<int>(t)].x + eyes[s].x;
				rect.y = faces[static_cast<int>(t)].y + eyes[s].y;
				rect.width = eyes[s].width;
				rect.height = eyes[s].height;
				rectangle(frame, rect, Scalar(255, 255, 0), 2, 8, 0);
			}
		}
		imshow("face", frame);
		if (waitKey(10) == 27) {
			break;
		}
	}
	capture.release();
	destroyAllWindows();

	return 0;
}

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年5月22日
下一篇 2022年5月22日

相关推荐