- 1.关于.xml文件位置,Opencv下载和导入Visual studio 2022
- 2.一张图片的测试
- 3.实时检测
https://blog.csdn.net/Keep_Trying_Go/article/details/124902276
关于.xml位置
关于使用python中的opencv实现人脸识别:
https://mydreamambitious.blog.csdn.net/article/details/124851743
2.一张图片的测试
这里根据自己的需要加载相应的.xml文件
#include#include 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 faces; //输入图像 vector & 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 (t)], Scalar(255, 255, 0), 2, 8, 0); cv::Point locate; locate.x = (float)(faces[static_cast (t)].x + faces[static_cast (t)].width / 4); locate.y = (float)(faces[static_cast (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& 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#include using namespace cv; using namespace std; //haarcascade_frontalcatface.xml //opencv_world455d.lib //E:Visual studio 2019Opencvopencvbuildinclude //E:Visual studio 2019Opencvopencvbuildx64vc15lib 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 faces; //输入图像 vector & 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 (t)], Scalar(255, 255, 0), 2, 8, 0); cv::Point locate; locate.x = (float)(faces[static_cast (t)].x + faces[static_cast (t)].width / 4); locate.y = (float)(faces[static_cast (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#include using namespace cv; using namespace std; //haarcascade_frontalcatface.xml //opencv_world455d.lib //E:Visual studio 2019Opencvopencvbuildinclude //E:Visual studio 2019Opencvopencvbuildx64vc15lib 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 faces; vector eyes; //输入图像 vector & 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 (t)], Scalar(255, 255, 0), 2, 8, 0); cv::Point locate; locate.x = (float)(faces[static_cast (t)].x + faces[static_cast (t)].width / 4); locate.y = (float)(faces[static_cast (t)].y - 10); putText(frame, "Person", locate, FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 255), 2, 8); //首先在找到人脸的基础上进行人眼检测 Mat eyeLocate = frame(faces[static_cast (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 (t)].x + eyes[s].x; rect.y = faces[static_cast (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; }



