在ubuntu下基于opencv实现人脸识别检测
·
在ubuntu下基于opencv实现人脸检测
1、开发环境
ubuntu版本:22.04
opencv版本:opencv4.5.4
摄像头类型:USB免驱摄像头
2、实现人脸识别功能
2.1 虚拟机搭建环境
1、需要安装相应opencv库,执行命令
# sudo apt update
# sudo apt install libopencv-dev python3-opencv
#
2、为了方便我们快速查验ubuntu是否能显示及摄像头的信息
#sudo apt install v4l-utils
#sudo apt install gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly
查看相关摄像头信息
# ls /dev/video*
# v4l2-ctl -D -d /dev/video0
Driver Info:
Driver name : uvcvideo
Card type : USB Camera 1080P: USB Camera 10
Bus info : usb-0000:03:00.0-2
Driver version : 6.8.12
Capabilities : 0x84a00001
Video Capture
Metadata Capture
Streaming
Extended Pix Format
Device Capabilities
3、预览摄像头指令
gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! videoscale ! video/x-raw,width=640,height=480 ! autovideosink
如果摄像头显示正常,那就可以进行下一步编写代码了,忽略异常情况的处理
小编在使用gst显示摄像头的时候异常,发现是由于虚拟机没有把usb兼容性的USB3.1打开,而是默认为USB2.0。导致图像无法输出。

设置完后重新启动虚拟机就能正常查看界面了
2.2 编写源码
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect.hpp"
#include <vector>
using namespace cv;
using namespace std;
int main()
{
// 使用GStreamer管道从MIPI摄像头捕获视频,添加视频帧率
VideoCapture capture("/dev/video0", CAP_V4L2);//CAP_ANY-->auto //CAP_GSTREAMER
// 设置属性
capture.set(cv::CAP_PROP_FRAME_WIDTH, 640);
capture.set(cv::CAP_PROP_FRAME_HEIGHT, 480);
capture.set(cv::CAP_PROP_FPS, 30);
capture.set(CAP_PROP_FOURCC, VideoWriter::fourcc('N', 'V', '1', '2'));//'NV12'、'MJPG'、'YUYV'
if (!capture.isOpened())
{
// 如果无法打开摄像头,则输出提示信息
cout << "无法打开摄像头" << endl;
return -1;
}
//添加opecv自带的人脸识别模型
cv::CascadeClassifier face_cascade;
std::string face_cascade_path = "/usr/share/opencv4/haarcascades/haarcascade_frontalface_default.xml";
if (!face_cascade.load(face_cascade_path))
{
std::cerr << "错误:无法加载人脸检测模型!" << std::endl;
std::cerr << "请确认文件存在于: " << face_cascade_path << std::endl;
return -1;
}
std::vector<cv::Rect> faces; // 存储检测到的人脸矩形
while (1)
{
// 从摄像头捕获帧
cv::Mat frame;
cv::Mat gray_frame;
capture >> frame; //frame.read(capture);
// 如果捕获到帧,则显示它
if (!frame.empty())
{
cvtColor(frame, gray_frame, COLOR_BGR2GRAY);
cv::equalizeHist(gray_frame, gray_frame);
face_cascade.detectMultiScale(gray_frame, faces, 1.1, 3, 0, cv::Size(120, 120));//进行判断
for (const auto& face : faces) {
if (!face.empty()) {
/*
cv::Rect first_face = faces[0]; // 第一个检测到的人脸
int x = first_face.x; // 左上角X坐标
int y = first_face.y; // 左上角Y坐标
int width = first_face.width; // 宽度
int height = first_face.height; // 高度
int area = first_face.area(); // 面积 = width * height
std::cout << "人脸 " << ": "<< "位置(" << face.x << "," << face.y << "), "<< "大小" << face.width << "x" << face.height << std::endl;
*/
cv::rectangle(frame, face, cv::Scalar(0, 255, 0), 2); // 绿色边框,2像素粗细
cv::circle(frame, cv::Point(face.x + face.width/2, face.y + face.height/2), 3, cv::Scalar(0, 0, 255), -1); // 红色实心圆点
}
}
imshow("Camera", frame);
if (!faces.empty())
{
std::cout << "检测到 " << faces.size() << " 张人脸" << std::endl;
}
}
// 按下'q'键退出循环
if (waitKey(1) == 'q')
{
break;
}
}
// 释放资源并关闭窗口
capture.release();
destroyAllWindows();
return 0;
}
2.3 编译demo.cpp指令
g++ demo.cpp -o demo `pkg-config --cflags --libs opencv4`
解析pkg-config --cflags --libs opencv4
pkg-config --cflags --libs opencv4
相当于
-I/usr/include/opencv4 -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_barcode -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm \
-lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape \
-lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets \
-lopencv_text -lopencv_plot -lopencv_ml -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_wechat_qrcode -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect \
-lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)