#include"video_processing.h"\n#include"<opencv2/dnn.hpp>"\n#include"<opencv2/opencv.hpp>"\n#include"<opencv2/imgproc.hpp>"\n#include"<opencv2/highgui.hpp>"\n\n\nVideoProcessor::VideoProcessor(QObject parent) : QObject(parent)\n{\n m_camera = new QCamera(this);\n m_imageCapture = new QCameraImageCapture(m_camera, this);\n\n connect(m_imageCapture, SIGNAL(imageAvailable(int,QVideoFrame)), this, SLOT(processFrame(int,QVideoFrame)));\n\n m_camera->setCaptureMode(QCamera::CaptureStillImage);\n m_camera->start();\n}\n\nVideoProcessor::~VideoProcessor(){\n delete m_imageCapture;\n delete m_camera;\n}\n\nvoid VideoProcessor::startCamera()\n{\n m_imageCapture->capture();\n}\n\nvoid VideoProcessor::processFrame(int requestid, const QImage &Image)\n{\n Q_UNUSED(requestid);\n\n // Convert QVideoFrame to cv::Mat\n cv::Mat img;\n\n\n // Process the image using OpenCV functions\n // ...\n cv::Mat srcImage = QImageToCvMat(Image);\n \n\n // Convert the processed image back to QImage\n QImage processedImg(img.data, img.cols, img.rows, QImage::Format_RGB888);\n\n // Emit signal with the processed image\n emit frameProcessed(processedImg);\n}\n\n\n\ncv::Mat QImageToCvMat(const QImage& image)\n{\n cv::Mat mat;\n switch (image.format())\n {\n case QImage::Format_RGB888:\n mat = cv::Mat(image.height(), image.width(), CV_8UC3, const_cast<uchar>(image.bits()), image.bytesPerLine());\n cv::cvtColor(mat, mat, cv::COLOR_RGB2BGR); // 如果需要将RGB格式转换为BGR格式\n break;\n\n case QImage::Format_Grayscale8:\n mat = cv::Mat(image.height(), image.width(), CV_8UC1, const_cast<uchar*>(image.bits()), image.bytesPerLine());\n break;\n\n // 其他QImage格式的处理方式\n\n default:\n qWarning() << "Unsupported image format";\n break;\n }\n\n return mat;\n}\n\n根据这段代码在mainwindow.cpp中写显示视频的代码内容:你可以使用Qt的QLabel控件来显示视频。首先,在MainWindow的构造函数中创建一个QLabel对象并设置它的显示属性,然后在frameProcessed信号的槽函数中更新QLabel的图像。\n\nMainWindow.h:\ncpp\n#include <QMainWindow>\n#include <QLabel>\n\n#include \"video_processing.h\"\n\nclass MainWindow : public QMainWindow\n{\n Q_OBJECT\n\npublic:\n MainWindow(QWidget *parent = nullptr);\n ~MainWindow();\n\nprivate slots:\n void updateFrame(const QImage& image);\n\nprivate:\n QLabel* m_videoLabel;\n VideoProcessor* m_videoProcessor;\n};\n\n\nMainWindow.cpp:\ncpp\n#include \"mainwindow.h\"\n\nMainWindow::MainWindow(QWidget *parent)\n : QMainWindow(parent)\n{\n m_videoLabel = new QLabel(this);\n setCentralWidget(m_videoLabel);\n\n // 创建视频处理对象\n m_videoProcessor = new VideoProcessor(this);\n\n // 连接信号和槽\n connect(m_videoProcessor, SIGNAL(frameProcessed(QImage)), this, SLOT(updateFrame(QImage)));\n\n // 启动摄像头\n m_videoProcessor->startCamera();\n}\n\nMainWindow::~MainWindow()\n{\n delete m_videoProcessor;\n}\n\nvoid MainWindow::updateFrame(const QImage& image)\n{\n // 更新QLabel的图像\n m_videoLabel->setPixmap(QPixmap::fromImage(image));\n\n // 调整QLabel的大小\n m_videoLabel->setScaledContents(true);\n m_videoLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);\n}\n\n\n在这个示例中,我们将QLabel设置为MainWindow的中央小部件,并在updateFrame槽函数中更新图像。注意要使用setScaledContents函数来保持图像的原始纵横比,并使用setSizePolicy函数来让QLabel自适应窗口大小。

Qt OpenCV 视频处理:使用 QCamera 和 QLabel 显示实时视频流

原文地址: https://www.cveoy.top/t/topic/pPNF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录