当前位置: 首页 > news >正文

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));
}
http://www.lryc.cn/news/529394.html

相关文章:

  • OpenEuler学习笔记(十六):搭建postgresql高可用数据库环境
  • 数学平均数应用
  • 元旦和春节取名的历史变迁
  • USB鼠标的数据格式
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.27 线性代数王国:矩阵分解实战指南
  • Kafka常见问题之 java.io.IOException: Disk error when trying to write to log
  • libOnvif通过组播不能发现相机
  • Flink (十二) :Table API SQL (一) 概览
  • FFmpeg(7.1版本)的基本组成
  • 基于微信小程序的辅助教学系统的设计与实现
  • 单片机基础模块学习——超声波传感器
  • HTML<hgroup>标签
  • C++并发编程指南08
  • Spring Boot - 数据库集成03 - 集成Mybatis
  • python:洛伦兹变换
  • “星门计划对AI未来的意义——以及谁将掌控它”
  • 为什么“记住密码”适合持久化?
  • 国产SiC碳化硅功率器件技术成为服务器电源升级的核心引擎
  • 【Block总结】动态蛇形卷积,专注于细长和弯曲的局部结构|即插即用
  • Spring MVC 框架:构建高效 Java Web 应用的利器
  • 新鲜速递:DeepSeek-R1开源大模型本地部署实战—Ollama + MaxKB 搭建RAG检索增强生成应用
  • Linux_线程同步生产者消费者模型
  • Origami Agents:通过AI驱动的研究工具提升B2B销售效率
  • linux的/proc 和 /sys目录差异
  • AIGC时代的Vue或React前端开发
  • 代码随想录算法训练营第三十九天-动态规划-337. 打家劫舍 III
  • Java线程认识和Object的一些方法
  • 【算法应用】基于A*-蚁群算法求解无人机城市多任务点配送路径问题
  • 电梯系统的UML文档14
  • 一种用于低成本水质监测的软传感器开源方法:以硝酸盐(NO3⁻)浓度为例