欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > RK3568使用opencv(使用摄像头捕获图像数据显示)

RK3568使用opencv(使用摄像头捕获图像数据显示)

2025/1/31 22:57:05 来源:https://blog.csdn.net/m0_49476241/article/details/145394899  浏览:    关键词:RK3568使用opencv(使用摄像头捕获图像数据显示)

文章目录

  • 一、opencv相关的类
      • 1. **cv::VideoCapture**
      • 2. **cv::Mat**
      • 3. **cv::cvtColor**
      • 4. **QImage**
      • 5. **QPixmap**
      • 总结
  • 二、代码实现


一、opencv相关的类

1. cv::VideoCapture

cv::VideoCapture 是 OpenCV 中用于视频捕捉的类,常用于从摄像头、视频文件、或者图像序列中捕获视频帧。它的主要功能是获取视频流或实时图像。

  • 作用:它用于从视频文件、摄像头、图像序列中捕获图像帧,在这个示例中,我们使用它来从摄像头捕获视频流。

  • 常用函数

    • cv::VideoCapture cap(0):构造函数,打开默认摄像头。如果需要打开其他设备或文件,可以传入不同的参数(例如,cap.open("video.mp4")用于打开视频文件)。
    • cap.isOpened():检查摄像头是否成功打开。返回 true 表示成功,false 表示失败。
    • cap >> frame:从摄像头捕获一帧图像并将其存储到frame中。每次调用cap >> frame时都会读取摄像头的下一帧图像。
    • cap.release():释放摄像头资源,当不再需要时关闭摄像头。

    示例:

    cv::VideoCapture cap(0);  // 打开默认摄像头
    if (!cap.isOpened()) {qWarning("Cannot open camera");return;
    }cv::Mat frame;
    cap >> frame;  // 从摄像头捕获一帧图像
    

2. cv::Mat

cv::Mat 是 OpenCV 中最常用的图像数据结构。它表示一个矩阵,通常用来存储图像数据,图像的每个像素对应矩阵中的一个元素。

  • 作用:用于存储图像数据。每当我们从摄像头捕获一帧图像时,它会以 cv::Mat 的形式存储。

  • 常用函数

    • cv::Mat frame:声明一个 cv::Mat 对象,用于存储图像。
    • frame.data:返回图像数据的指针,表示图像的原始数据。
    • frame.colsframe.rows:分别表示图像的列数(宽度)和行数(高度)。
    • frame.step:表示图像数据每一行的字节数,通常用于处理图像数据时的行对齐。

    示例:

    cv::Mat frame;
    cap >> frame;  // 从摄像头捕获图像帧
    

3. cv::cvtColor

cv::cvtColor 是 OpenCV 中用来进行颜色空间转换的函数。它可以将图像从一种颜色格式转换为另一种颜色格式。例如,BGR 转为 RGB、RGB 转为灰度图等。

  • 作用:将图像从一个颜色空间转换为另一个颜色空间。因为 OpenCV 默认使用 BGR 格式,而 Qt 使用 RGB 格式,所以我们需要将捕获的图像从 BGR 转换为 RGB。

  • 常用用法

    cv::cvtColor(cvImage, cvImage, cv::COLOR_BGR2RGB);
    
    • cvImage:待转换的图像。
    • cv::COLOR_BGR2RGB:转换类型,表示从 BGR 转为 RGB。

    示例:

    cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB);  // 将BGR格式转换为RGB格式
    

4. QImage

QImage 是 Qt 用来表示图像数据的类。它是 Qt 中图像处理的核心类,用于加载、保存和显示图像。

  • 作用:用于在 Qt 应用中表示和操作图像数据。QImage 适用于将图像数据加载到内存中,并支持多种格式的图像显示和保存。

  • 常用函数

    • QImage::QImage(const uchar *data, int width, int height, int stride, Format format):构造函数,用于从原始数据创建一个 QImage 对象。data 是图像数据的指针,widthheight 是图像的尺寸,stride 是每行数据的字节数,format 是图像的格式。
    • QImage::Format_RGB888:表示 24 位 RGB 格式,每个像素占 3 个字节(R、G、B)。

    示例:

    QImage img(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888);
    
    • frame.data:图像数据的指针。
    • frame.colsframe.rows:图像的宽和高。
    • frame.step:每行图像数据的字节数。
    • QImage::Format_RGB888:指定图像格式为 24 位 RGB。

5. QPixmap

QPixmap 是 Qt 中用于显示图像的类。它比 QImage 更适合用作显示图像,因为它能更高效地处理图像的显示。

  • 作用:用于显示图像。QPixmapQImage 类似,但它是一个更适合用于图形显示的类,通常用于在 Qt 控件中展示图像。

  • 常用函数

    • QPixmap::fromImage(QImage &image):从 QImage 创建一个 QPixmap

    示例:

    label->setPixmap(QPixmap::fromImage(img));  // 将QImage转换为QPixmap并显示
    

总结

  • cv::VideoCapture:用于从视频设备(如摄像头)获取图像帧。
  • cv::Mat:用于存储图像数据的矩阵。每一帧图像都是一个 cv::Mat 对象。
  • cv::cvtColor:用于颜色空间转换,通常用于将 OpenCV 的 BGR 格式转换为 Qt 的 RGB 格式。
  • QImage:Qt 用于表示图像数据的类,提供了从原始数据创建图像并显示的功能。
  • QPixmap:Qt 用于显示图像的类,通常用于在界面中显示图像。

这些类和函数组合在一起,使得 OpenCV 能够与 Qt 无缝集成,从摄像头捕获图像并显示在 Qt 界面中。

二、代码实现

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QLabel>
#include <QTimer>
#include <opencv2/opencv.hpp>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void updateFrame();  // 更新视频帧private:Ui::Widget *ui;QLabel *label;  // 用于显示视频的QLabelcv::VideoCapture cap;  // OpenCV的摄像头捕获对象QTimer *timer;  // 用于定时刷新视频帧
};#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include <QImage>
#include <QPixmap>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent),ui(new Ui::Widget),label(new QLabel(this)),cap(0)  // 使用默认摄像头
{ui->setupUi(this);label->setGeometry(10, 10, 640, 480);  // 设置QLabel的位置和大小if (!cap.isOpened()) {qWarning("Cannot open camera");return;}// 创建定时器,每隔30ms捕获一帧图像并更新显示timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &Widget::updateFrame);timer->start(30);  // 30ms更新一次(约33帧每秒)
}Widget::~Widget()
{delete ui;
}void Widget::updateFrame()
{cv::Mat frame;cap >> frame;  // 捕获一帧图像if (frame.empty()) {qWarning("Captured frame is empty!");return;}// 将OpenCV图像从BGR格式转换为RGB格式cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB);// 将OpenCV的Mat转换为Qt支持的QImageQImage img(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888);// 将QImage转换为QPixmap并设置到QLabel上显示label->setPixmap(QPixmap::fromImage(img));
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com