接着上一节文章《在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
Logo

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

更多推荐