文章目录
- 一、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.cols
和frame.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
是图像数据的指针,width
和height
是图像的尺寸,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.cols
和frame.rows
:图像的宽和高。frame.step
:每行图像数据的字节数。QImage::Format_RGB888
:指定图像格式为 24 位 RGB。
5. QPixmap
QPixmap
是 Qt 中用于显示图像的类。它比 QImage
更适合用作显示图像,因为它能更高效地处理图像的显示。
-
作用:用于显示图像。
QPixmap
与QImage
类似,但它是一个更适合用于图形显示的类,通常用于在 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));
}