使用Qt+Opencv实现打开图片和摄像头

在这里演示了做一个打开图片和采用opencv打开摄像头的界面的例子。
我的环境是:Qt 5.12 + Opencv 4.5.3 + vs2017

界面效果

使用Qt+Opencv实现打开图片和摄像头

; 代码

代码还是比较简单清晰的,就直接贴上了。

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include
#include
#include
#include
#include
#include

#include
#include
#include
#include
#include

#include "ui_MainWindow.h"

using namespace cv;
using namespace std;

namespace Ui {
    class myMainWindow;
}

class myMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    myMainWindow(QWidget *parent = Q_NULLPTR);

    QImage MatImageToQt(const Mat &src);
    ~myMainWindow();

private slots:
    void readFrame();
    void on_OpenImageBtn_clicked();
    void on_OpenCameraBtn_clicked();

private:
    Ui::myMainWindowClass ui;

    Mat src;
    QImage img;
    QString img_name;

    VideoCapture cap;
    Mat src_image;
    QTimer *timer;
    QImage *image;
};

#endif

这里注意 .h文件中的代码不要一下子全复制粘贴过去,最好是把每部分对应的粘贴过去,原本新建工程之后就有的代码就不要改了,不然 Ui::myMainWindowClass ui;这句代码容易报错。

MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"

using namespace cv;

myMainWindow::myMainWindow(QWidget *parent):
    QMainWindow(parent)
{
    ui.setupUi(this);

    setWindowTitle(tr("Main Window"));

    timer = new QTimer(this);
    image = new QImage();
    connect(timer, SIGNAL(timeout()), this, SLOT(readFrame()));
}

myMainWindow::~myMainWindow() {

}

void myMainWindow::on_OpenImageBtn_clicked() {

    QString fileName = QFileDialog::getOpenFileName(this,
        tr("open Image"),
        "./images",
        tr("Image File(*.png *.bmp *.jpg *.jpeg)"));

    if (fileName.isEmpty())
    {
        return;
    }

    Mat srcImage = imread(fileName.toUtf8().data());

    cv::cvtColor(srcImage, srcImage, CV_BGR2RGB);

    QImage disImage = QImage((const unsigned char*)srcImage.data,
        srcImage.cols, srcImage.rows, QImage::Format_RGB888);

    ui.label->setPixmap(QPixmap::fromImage(disImage.scaled(ui.label->size(),
        Qt::KeepAspectRatio
    )));
}

void myMainWindow::on_OpenCameraBtn_clicked(){
    cap.open(0);
    timer->start(33);
}

void myMainWindow::readFrame() {
    cap.read(src_image);

    QImage imag = MatImageToQt(src_image);
    ui.label->setPixmap(QPixmap::fromImage(imag));
}

QImage myMainWindow::MatImageToQt(const Mat &src)
{
    if (src.type() == CV_8UC1)
    {
        QImage qImage(src.cols, src.rows, QImage::Format_Indexed8);
        qImage.setColorCount(256);
        for (int i = 0; i < 256; i++)
        {
            qImage.setColor(i, qRgb(i, i, i));
        }
        uchar *pSrc = src.data;
        for (int row = 0; row < src.rows; row++)
        {
            uchar *pDest = qImage.scanLine(row);
            memcmp(pDest, pSrc, src.cols);
            pSrc += src.step;
        }
        return qImage;
    }
    else if (src.type() == CV_8UC3)
    {
        const uchar *pSrc = (const uchar*)src.data;
        QImage qImage(pSrc, src.cols, src.rows, src.step, QImage::Format_RGB888);
        return qImage.rgbSwapped();
    }
    else if (src.type() == CV_8UC4)
    {
        const uchar *pSrc = (const uchar*)src.data;
        QImage qImage(pSrc, src.cols, src.rows, src.step, QImage::Format_ARGB32);

        return qImage.copy();
    }
    else
    {
        return QImage();
    }
}

编辑完代码后,需要进行如下操作,将按钮与槽函数(on_OpenImageBtn_clicked()on_OpenCameraBtn_clicked())关联起来。

1.打开 .ui文件,点击这个按钮编辑信号与槽

使用Qt+Opencv实现打开图片和摄像头
2.按住按钮往空白地方拖动,会自动弹出这个界面。
使用Qt+Opencv实现打开图片和摄像头
3.先点击左边的 clicked(),然后点击右边的编辑,在弹出的对话框的槽的下面点击加号。
使用Qt+Opencv实现打开图片和摄像头
使用Qt+Opencv实现打开图片和摄像头
4.把对应的函数名字写上之后点确定,然后在右边选择你添加的对应的函数,点确定。
使用Qt+Opencv实现打开图片和摄像头
5.把两个按钮都分别与对应的函数关联起来就可以了,不要忘记保存。
使用Qt+Opencv实现打开图片和摄像头
到这里结束就可以运行看结果啦~

Original: https://blog.csdn.net/qq_44942539/article/details/121799517
Author: 菜鸟的自我修养~
Title: 使用Qt+Opencv实现打开图片和摄像头

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/532364/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球