Qt+opencv实现人脸识别检测
·
Qt+opencv实现人脸识别检测
接着上一节文章《在ubuntu下基于opencv实现人脸识别检测》,我们在这个的基础下,加上Qt并且在RK3588平台下实现。
1、代码实现
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QLabel>
#include <QWidget>
#include "camera_thread.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
public slots:
void recv_frame(QImage );
private:
Ui::Widget *ui;
void Ui_init();
camera_thread *thread;
QLabel *frame;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "QGridLayout"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
Ui_init();
thread = new camera_thread;
connect(thread,SIGNAL(send_frame(QImage)), this, SLOT(recv_frame(QImage)));
thread->start();
}
void Widget::recv_frame(QImage iamge)
{
frame->setPixmap(QPixmap::fromImage(iamge));
}
void Widget::Ui_init()
{
frame = new QLabel;
QGridLayout* gridlayout = new QGridLayout;
gridlayout->addWidget(frame);
gridlayout->setAlignment(frame,Qt::AlignCenter);
this->setLayout(gridlayout);
}
Widget::~Widget()
{
delete ui;
}
camera_thread.h
#ifndef CAMERA_THREAD_H
#define CAMERA_THREAD_H
#include <QThread>
#include <QObject>
#include <QImage>
class camera_thread : public QThread
{
Q_OBJECT
public:
camera_thread(QObject *parent = nullptr);
protected:
void run();
signals:
void send_frame(QImage);
};
#endif // CAMERA_THREAD_H
camera_thread.cpp
#include "camera_thread.h"
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect.hpp"
#include <QDebug>
camera_thread::camera_thread(QObject *parent): QThread(parent)
{
}
void camera_thread::run()
{
// 使用GStreamer管道从MIPI摄像头捕获视频,添加视频帧率
cv::VideoCapture capture("/dev/video0", cv::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(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));//'NV12'、'MJPG'、'YUYV'
if (!capture.isOpened())
{
// 如果无法打开摄像头,则输出提示信息
qDebug()<< "无法打开摄像头" ;
return;
}
//添加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))
{
qDebug() << "错误:无法加载人脸检测模型!";
qDebug() << "请确认文件存在于: "+ QString("%1").arg(face_cascade_path.data());
}
std::vector<cv::Rect> faces; // 存储检测到的人脸矩形
while (1)
{
// 从摄像头捕获帧
cv::Mat frame;
cv::Mat gray_frame;
capture >> frame; //frame.read(capture);
// 如果捕获到帧,则显示它
if (!frame.empty())
{
cv::cvtColor(frame, gray_frame, cv::COLOR_BGR2GRAY);
cv::equalizeHist(gray_frame, gray_frame);
face_cascade.detectMultiScale(gray_frame, faces, 1.1, 4, 0, cv::Size(150,150));
for (const auto& face : faces) {
if (!face.empty()) {
cv::rectangle(frame, face, cv::Scalar(0, 255, 0), 3); // 绿色边框,2像素粗细
cv::putText(frame, "face", cv::Point(face.x+face.width/2, face.y), cv::FONT_HERSHEY_SIMPLEX ,0.5, cv::Scalar(0, 255, 0),2);
// cv::circle(frame, cv::Point(face.x + face.width/2, face.y + face.height/2), 3, cv::Scalar(0, 0, 255), -1); // 红色实心圆点
}
}
QImage image (frame.data, frame.cols, frame.rows, QImage::Format_BGR888);
emit send_frame(image);
}
}
}
如果要在ARM架构实现该程序,需要在Qt程序的.pro文件上添加环境变量,以获取到opencv的相关库和头文件
ARM64架构
INCLUDEPATH += /home/huyunyun/RK3588/SDK/buildroot/output/rockchip_rk3588/host/aarch64-buildroot-linux-gnu/sysroot/usr/include/opencv4
LIBS+= -L/home/huyunyun/SDK/buildroot/output/rockchip_rk3588/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib \
-lopencv_highgui -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_video -lopencv_calib3d -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_videoio -lopencv_imgcodecs -lopencv_imgproc -lopencv_core
ubuntu
CONFIG += link_pkgconfig
PKGCONFIG += opencv4
2、buildroot下配置opencv4
进入到RK3588的SDK源码buildroot上,执行指令
make ARCH=arm64 menuconfig

选择想要的功能进行勾上
注意:highgui上的gui toolkit建议选择qt5
勾选完后记得保存配置
BR2_PACKAGE_OPENCV4=y
#
# OpenCV modules
#
BR2_PACKAGE_OPENCV4_LIB_CALIB3D=y
BR2_PACKAGE_OPENCV4_LIB_DNN=y
BR2_PACKAGE_OPENCV4_LIB_FEATURES2D=y
BR2_PACKAGE_OPENCV4_LIB_FLANN=y
BR2_PACKAGE_OPENCV4_LIB_HIGHGUI=y
# BR2_PACKAGE_OPENCV4_GUI_NONE is not set
#
# gtk2 support needs libgtk2
#
#
# gtk3 support needs libgtk3
#
BR2_PACKAGE_OPENCV4_WITH_QT5=y
#
# opengl support needs an OpenGL provider
#
BR2_PACKAGE_OPENCV4_LIB_IMGCODECS=y
BR2_PACKAGE_OPENCV4_LIB_IMGPROC=y
BR2_PACKAGE_OPENCV4_LIB_ML=y
BR2_PACKAGE_OPENCV4_LIB_OBJDETECT=y
BR2_PACKAGE_OPENCV4_LIB_PHOTO=y
BR2_PACKAGE_OPENCV4_LIB_PYTHON=y
BR2_PACKAGE_OPENCV4_LIB_SHAPE=y
BR2_PACKAGE_OPENCV4_LIB_STITCHING=y
BR2_PACKAGE_OPENCV4_LIB_SUPERRES=y
# BR2_PACKAGE_OPENCV4_LIB_TS is not set
BR2_PACKAGE_OPENCV4_LIB_VIDEOIO=y
BR2_PACKAGE_OPENCV4_LIB_VIDEO=y
BR2_PACKAGE_OPENCV4_LIB_VIDEOSTAB=y
#
# Test sets
#
BR2_PACKAGE_OPENCV4_BUILD_TESTS=y
BR2_PACKAGE_OPENCV4_BUILD_PERF_TESTS=y
#
# 3rd party support
#
BR2_PACKAGE_OPENCV4_WITH_FFMPEG=y
BR2_PACKAGE_OPENCV4_WITH_GSTREAMER1=y
BR2_PACKAGE_OPENCV4_JPEG2000_NONE=y
# BR2_PACKAGE_OPENCV4_JPEG2000_WITH_JASPER is not set
# BR2_PACKAGE_OPENCV4_JPEG2000_WITH_OPENJPEG is not set
BR2_PACKAGE_OPENCV4_WITH_JPEG=y
BR2_PACKAGE_OPENCV4_WITH_PNG=y
BR2_PACKAGE_OPENCV4_WITH_PROTOBUF=y
BR2_PACKAGE_OPENCV4_WITH_TBB=y
BR2_PACKAGE_OPENCV4_WITH_TIFF=y
BR2_PACKAGE_OPENCV4_WITH_V4L=y
BR2_PACKAGE_OPENCV4_WITH_WEBP=y
#
# Install options
#
BR2_PACKAGE_OPENCV4_INSTALL_DATA=y
3、成果展示
在RK3588上进行演示。
# ./camera_opencv_demo
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)