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

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐