目录

1 我的RK3588开发板

2安装opencv

3 安装QT

4 摄像头节点

5 安装向日葵

6 QT代码

6.1 qt_opencv_cmaera_demo.pro

6.2 mainwindow.ui

6.3 mainwindow.h

6.4 mainwindow.cpp

6.5 main.cpp

参考文献:


1 我的RK3588开发板

我把它放客厅了,连接电视。然后我在书房远程登录做开发,

2安装opencv

这里不下载源码编译了,直接用apt-get安装opencv

sudo apt-get update
sudo apt-get install libopencv-dev

然后find / -iname *opencv*就可以看到安装的opencv了

3 安装QT

 同样QT也不编译源码,直接用apt-get安装。

sudo apt-get install qt5-default
sudo apt-get install qt5-doc qt5-doc-html qtbase5-doc-html qtbase5-examples
sudo apt-get install qtcreator
sudo apt-get install qt5*

然后qmake -query可以看到安装的QT。 

4 摄像头节点

可以通过v4l2-ctl --list-devices来获取摄像头的节点。

5 安装向日葵

由于我需要编写界面程序,所以仅仅SSH远程登录不太够,我需要直接远程桌面,因此安装向日葵

去向日葵官网下载Linux arm64麒麟版本;

然后安装 

sudo apt-get install libappindicator3-1;
sudo dpkg -i SunloginClient_11.0.1.44968_kylin_arm.deb

6 QT代码

6.1 qt_opencv_cmaera_demo.pro

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

INCLUDEPATH += /usr/include/opencv4

LIBS += -L/path/to/your/opencv/libs \
        -lopencv_core \
        -lopencv_imgproc \
        -lopencv_highgui \
        -lopencv_ml \
        -lopencv_video \
        -lopencv_videoio \
        -lopencv_features2d \
        -lopencv_calib3d \
        -lopencv_objdetect \
        -lopencv_flann


# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

6.2 mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>952</width>
    <height>644</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>40</x>
      <y>10</y>
      <width>891</width>
      <height>411</height>
     </rect>
    </property>
    <property name="text">
     <string>TextLabel</string>
    </property>
   </widget>
   <widget class="QPushButton" name="openCameraButton">
    <property name="geometry">
     <rect>
      <x>190</x>
      <y>530</y>
      <width>131</width>
      <height>27</height>
     </rect>
    </property>
    <property name="text">
     <string>open camera</string>
    </property>
   </widget>
   <widget class="QPushButton" name="closeCameraButton">
    <property name="geometry">
     <rect>
      <x>590</x>
      <y>530</y>
      <width>131</width>
      <height>27</height>
     </rect>
    </property>
    <property name="text">
     <string>close camera</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>952</width>
     <height>24</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

6.3 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QWidget>
#include <QImage>
#include <QDebug>
#include <QTimer>
#include <QPixmap>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/imgproc/types_c.h>


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public slots:
    void on_opencamera_clicked();//打开摄像头
    void readFrame();//读取一帧
    void on_closecamera_clicked();//关闭摄像头



private:
    Ui::MainWindow *ui;
    QTimer *timer;//计时器
    QImage image;//用QImage形式记录的图片
    cv::VideoCapture cap;//视频捕捉
    cv::Mat frame;//用mat形式记录的图片
    void init();
};
#endif // MAINWINDOW_H

6.4 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/opencv.hpp>
#include<QTimer>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    init();
}


MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::init()
{
    timer = new QTimer(this);
    connect(timer,&QTimer::timeout,this,&MainWindow::readFrame);//超时就捕捉一张图片
    connect(ui->openCameraButton, &QPushButton::clicked, this, &MainWindow::on_opencamera_clicked);
    connect(ui->closeCameraButton, &QPushButton::clicked, this, &MainWindow::on_closecamera_clicked);
}


void MainWindow::on_opencamera_clicked()//打开摄像头
{

    // 打开摄像头,参数为摄像头的设备节点
    cap.open("/dev/video1");
    if (!cap.isOpened()) {
        std::cout << "无法打开摄像头" << std::endl;
    }
    timer->start(25);        // 开始计时
}

void MainWindow::readFrame(){//读取帧并显示

    // 从摄像头捕获一帧图像
    cap >> frame;
    // 检查图像是否为空
    if (frame.empty()) {
        std::cout << "无法捕获图像" << std::endl;
        return;
    }

    // 将OpenCV的Mat图像转换为Qt的QImage
    QImage img = QImage((const unsigned char*)(frame.data), frame.cols, frame.rows, QImage::Format_RGB888).rgbSwapped();

    // 在QLabel中显示图像
    ui->label->setPixmap(QPixmap::fromImage(img));
}

void MainWindow::on_closecamera_clicked()//关闭摄像头
{
    cap.release();
}



6.5 main.cpp

#include "mainwindow.h"

#include <QApplication>
#include <opencv2/opencv.hpp>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

#if 0
    // 创建一个VideoCapture对象
    cv::VideoCapture cap;

    // 打开摄像头,参数为摄像头的设备节点
    cap.open("/dev/video1");
    if (!cap.isOpened()) {
        std::cout << "无法打开摄像头" << std::endl;
        return -1;
    }
    // 创建一个Mat对象来存储摄像头的图像
    cv::Mat frame;
    while(1)
    {
        // 从摄像头捕获一帧图像
        cap >> frame;
        // 检查图像是否为空
        if (frame.empty()) {
            std::cout << "无法捕获图像" << std::endl;
            return -1;
        }
        // 显示图像
        cv::imshow("摄像头图像", frame);
        // 等待用户按键
        cv::waitKey(1);
    }

    // 释放摄像头
    cap.release();
#endif


    MainWindow w;
    w.show();
    return a.exec();
}

参考文献:

ArmSoM-W3之RK3588安装Qt+opencv+采集摄像头画面_rk3588 debian qt-CSDN博客

windows平台下Qt Creator的下载与安装流程_qt creator 下载-CSDN博客

RK3588安装向日葵-CSDN博客

2. Designer — [野火]嵌入式Qt应用开发实战指南——基于LubanCat-i.MX6ULL-MP157开发板 文档

1. Hello Qt — [野火]嵌入式Qt应用开发实战指南—基于LubanCat-RK开发板 文档

QT+opencv4实时获取摄像头的图像展示并附带截图功能_qt opencv 视频截图-CSDN博客

rk3588_demo: 在rk3588平台上,验证mpp、npu、驱动,流媒体等相关的功能。mpp包含,rockit,mpp,gstreamer,v4l2等; rockit vpss/vdec/venc/gdc/vgs/tde mpp:enc dec rga:npu 使用vi(rockit,v2l4)实时vo输出增加rtmp实时推流 - Gitee.com 

GitHub 加速计划 / opencv31 / opencv
142
15
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:3 个月前 )
d9a139f9 Animated WebP Support #25608 related issues #24855 #22569 ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [x] The PR is proposed to the proper branch - [x] There is a reference to the original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake 1 天前
09030615 V4l default image size #25500 Added ability to set default image width and height for V4L capture. This is required for cameras that does not support 640x480 resolution because otherwise V4L capture cannot be opened and failed with "Pixel format of incoming image is unsupported by OpenCV" and then with "can't open camera by index" message. Because of the videoio architecture it is not possible to insert actions between CvCaptureCAM_V4L::CvCaptureCAM_V4L and CvCaptureCAM_V4L::open so the only way I found is to use environment variables to preselect the resolution. Related bug report is [#25499](https://github.com/opencv/opencv/issues/25499) Maybe (but not confirmed) this is also related to [#24551](https://github.com/opencv/opencv/issues/24551) This fix was made and verified in my local environment: capture board AVMATRIX VC42, Ubuntu 20, NVidia Jetson Orin. ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [X] I agree to contribute to the project under Apache 2 License. - [X] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [X] The PR is proposed to the proper branch - [X] There is a reference to the original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake 1 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐