天天看點

Qt5時鐘顯示OpenCV4實時采集的圖像

添加一個timer來采圖。

QTimer *timer;
           

做一個時鐘任務:

void MainWindow::updateImage()
{
    if(capOpen)
    {
        cap >> src;
        if(src.empty())
            return;
        dst.create(src.size(), src.type());

        ui->label->setPixmap(cv2qt.cvMatToQPixmap(src));
        cv::cvtColor(src, srcGray, cv::COLOR_BGR2GRAY);

        if(srcGray.empty())
            return;
//        ui->horizontalSlider->setValue(20);
        cv::Mat tmp;
    //    cv::threshold(srcGray, tmp, 120., 255., cv::THRESH_BINARY);
        qDebug() << "start canny func";
        cannyProc(srcGray);
        ui->label_2->setPixmap(cv2qt.cvMatToQPixmap(dst));

//        capOpen = cap.open(0);
//        timer = new QTimer(this);
//        timer->start(100);
//        connect(timer, &QTimer::timeout, this, &MainWindow::updateImage);
    }
}
           

完整代碼:

mainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>

#include "cv2qt.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void cannyProc(cv::Mat in);

private:
    Ui::MainWindow *ui;

    cv::Mat src;
    cv::Mat srcGray;
    cv::Mat dst;
    cv::Mat detected_edges;
//    int edgeThres = 1;
    int lowThreshold;
//    int max_lowThreshold;
    int ratio = 3;
    int kernel_size = 3;

    CV2Qt cv2qt;
    QTimer *timer;
    cv::VideoCapture cap;
    bool capOpen;
private slots:
    void on_horizontalSlider_valueChanged(int value);
    void updateImage();
};
#endif // MAINWINDOW_H
           

mainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    src = cv::imread("D:/pic/lena.jpg");
    if(src.empty())
        return;
    dst.create(src.size(), src.type());

    ui->label->setPixmap(cv2qt.cvMatToQPixmap(src));
    cv::cvtColor(src, srcGray, cv::COLOR_BGR2GRAY);

    if(srcGray.empty())
        return;
    ui->horizontalSlider->setValue(20);
    cv::Mat tmp;
//    cv::threshold(srcGray, tmp, 120., 255., cv::THRESH_BINARY);
    qDebug() << "start canny func";
    cannyProc(srcGray);
    ui->label_2->setPixmap(cv2qt.cvMatToQPixmap(dst));

    capOpen = cap.open(0);
    timer = new QTimer(this);
    timer->start(100);
    connect(timer, &QTimer::timeout, this, &MainWindow::updateImage);


}

MainWindow::~MainWindow()
{
    timer->stop();
    cap.release();
    capOpen = false;
    delete ui;
}

void MainWindow::cannyProc(cv::Mat in)
{
    if(in.empty())
        return;
    if(in.channels()>1)
        return;
//    lowThreshold = low;
    qDebug() << "start blur";
    cv::blur(in, detected_edges, cv::Size(3,3));
    qDebug() << "start canny";
    cv::Canny(detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size);
    dst= cv::Scalar::all(0);
    qDebug() << "start copy";
    src.copyTo(dst, detected_edges);
//    out = dst;
}

void MainWindow::on_horizontalSlider_valueChanged(int value)
{
    qDebug() << "value: " << value;
    if(srcGray.empty())
        return;
    cv::Mat tmp;
    lowThreshold = value;
    cannyProc(srcGray);
    //cv::threshold(srcGray, tmp, double(value), 255., cv::THRESH_BINARY);
    ui->label_2->setPixmap(cv2qt.cvMatToQPixmap(dst));
}

void MainWindow::updateImage()
{
    if(capOpen)
    {
        cap >> src;
        if(src.empty())
            return;
        dst.create(src.size(), src.type());

        ui->label->setPixmap(cv2qt.cvMatToQPixmap(src));
        cv::cvtColor(src, srcGray, cv::COLOR_BGR2GRAY);

        if(srcGray.empty())
            return;
//        ui->horizontalSlider->setValue(20);
        cv::Mat tmp;
    //    cv::threshold(srcGray, tmp, 120., 255., cv::THRESH_BINARY);
        qDebug() << "start canny func";
        cannyProc(srcGray);
        ui->label_2->setPixmap(cv2qt.cvMatToQPixmap(dst));

//        capOpen = cap.open(0);
//        timer = new QTimer(this);
//        timer->start(100);
//        connect(timer, &QTimer::timeout, this, &MainWindow::updateImage);
    }
}

           

生成效果:

Qt5時鐘顯示OpenCV4實時采集的圖像

多謝,親愛的美美。