vs+opencv+QT调试程序

2021-09-28vs+opencv+QT简单的图像处理工程_opencv 用qt还是vs_二两山栀子的博客-CSDN博客

【vs+opencv+Qt搭建简单的图像处理界面】https://www.bilibili.com/video/BV16T411j7XQ?vd_source=0aeb782d0b9c2e6b0e0cdea3e2121eba

调试过程一直出现这种问题,后来改DEBUG为release就可以了

mainwindow.hpp

复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QLabel>
#include <QMainWindow>
#include <QFileDialog>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;

namespace Ui {
    class MainWindow;
    class mainwindowClass;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget* parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();
private:
    QImage MatToQImage(const cv::Mat& mat);				// MAT类型 转 QImage类型
    void display_MatInQT(QLabel* label, cv::Mat mat);	// MAT对象 QT显示

private:
    Ui::mainwindowClass* ui;
    Mat image;
    Mat mat_Gaussian;
    Mat gray;
};

#endif // MAINWINDOW_H#pragma once

mainwindow.cpp

复制代码
#include "mainwindow.hpp"
#include "ui_mainwindow.h"
#include <QMessageBox>
MainWindow::MainWindow(QWidget* parent) :
    QMainWindow(parent),
    ui(new Ui::mainwindowClass)
{
    ui->setupUi(this);
    ui->pushButton_2->setEnabled(false);
    ui->pushButton_3->setEnabled(false);
    ui->pushButton_4->setEnabled(false);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    //调用窗口打开文件
    ui->label->clear();
    ui->label_1->clear();
    QString filename = QFileDialog::getOpenFileName(this,
        tr("open image"),
        ".",
        tr("Image file(*.png *.jpg *.bmp)"));
    image = imread(filename.toLocal8Bit().data());
    if (image.data) {
        ui->pushButton_2->setEnabled(true);
        ui->pushButton_3->setEnabled(true);
        ui->pushButton_4->setEnabled(true);
        // 通过 lable 方式显示图片
        display_MatInQT(ui->label, image);
    }
    else
    {
        QMessageBox::information(this, tr("提示"), tr("未成功载入图片!"), QMessageBox::Ok);
    }
}
void MainWindow::on_pushButton_2_clicked()
{
    ui->label_1->clear();

    if (image.data)
    {
        // 高斯模糊
        GaussianBlur(image, mat_Gaussian, Size(29, 29), 0, 0);
        display_MatInQT(ui->label_1, mat_Gaussian);
    }
    else
    {
        QMessageBox::information(this, tr("提示"), tr("未成功载入图片!"), QMessageBox::Ok);
    }

}
void MainWindow::on_pushButton_3_clicked()
{
    ui->label_1->clear();

    if (image.data)
    {
        // 灰度化
        cvtColor(image, gray, COLOR_BGR2GRAY);
        display_MatInQT(ui->label_1, gray);
    }
    else
    {
        QMessageBox::information(this, tr("提示"), tr("未成功载入图片!"), QMessageBox::Ok);
    }

}
void MainWindow::on_pushButton_4_clicked()
{
    ui->label_1->clear();

    if (image.data)
    {
        // 边缘检测

        Canny(image, gray, 150, 100, 3);
        display_MatInQT(ui->label_1, gray);
    }
    else
    {
        QMessageBox::information(this, tr("提示"), tr("未成功载入图片!"), QMessageBox::Ok);
    }

}
QImage MainWindow::MatToQImage(const cv::Mat& mat)
{

    // 8-bits unsigned, NO. OF CHANNELS = 1
    if (mat.type() == CV_8UC1)
    {
        QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
        // Set the color table (used to translate colour indexes to qRgb values)
        image.setColorCount(256);
        for (int i = 0; i < 256; i++)
        {
            image.setColor(i, qRgb(i, i, i));
        }
        // Copy input Mat
        uchar* pSrc = mat.data;
        for (int row = 0; row < mat.rows; row++)
        {
            uchar* pDest = image.scanLine(row);
            memcpy(pDest, pSrc, mat.cols);
            pSrc += mat.step;
        }
        return image;
    }
    // 8-bits unsigned, NO. OF CHANNELS = 3
    else if (mat.type() == CV_8UC3)
    {
        // Copy input Mat
        const uchar* pSrc = (const uchar*)mat.data;
        // Create QImage with same dimensions as input Mat
        QImage image(pSrc, mat.cols, mat.rows, (int)mat.step, QImage::Format_RGB888);
        return image.rgbSwapped();
    }
    else if (mat.type() == CV_8UC4)
    {
        //qDebug() << "CV_8UC4";
        // Copy input Mat
        const uchar* pSrc = (const uchar*)mat.data;
        // Create QImage with same dimensions as input Mat
        QImage image(pSrc, mat.cols, mat.rows, (int)mat.step, QImage::Format_ARGB32);
        return image.copy();
    }
    else
    {
        //qDebug() << "ERROR: Mat could not be converted to QImage.";
        return QImage();
    }
}
// 
void MainWindow::display_MatInQT(QLabel* label, Mat mat)
{

    label->setPixmap(QPixmap::fromImage(MatToQImage(mat)).scaled(label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));

}
相关推荐
梵得儿SHI2 小时前
(第十篇)Spring AI 核心技术攻坚全梳理:企业级能力矩阵 + 四大技术栈攻坚 + 性能优化 Checklist + 实战项目预告
java·人工智能·spring·rag·企业级ai应用·springai技术体系·多模态和安全防护
chian-ocean2 小时前
深入 CANN 生态:使用 `modelzoo-samples` 快速部署视觉模型
人工智能
勾股导航2 小时前
Windows安装GPU环境
人工智能·windows·gnu
小羊不会打字2 小时前
探索 CANN 生态:深入解析 `ops-transformer` 项目
人工智能·深度学习·transformer
哈__2 小时前
CANN加速多模态融合推理:跨模态对齐与特征交互优化
人工智能·交互
红迅低代码平台(redxun)2 小时前
构建企业“第二大脑“:AI低代码平台如何打造智能知识中枢?
人工智能·低代码·ai agent·ai开发平台·智能体开发平台·红迅软件
Loo国昌2 小时前
【大模型应用开发】第六阶段:模型安全与可解释性
人工智能·深度学习·安全·transformer
乾元2 小时前
终端安全(EDR):用深度学习识别未知勒索软件
运维·人工智能·网络协议·安全·网络安全·自动化·安全架构
深鱼~2 小时前
构建高效Transformer模型:ops-transformer算子使用手册
人工智能·深度学习·transformer·cann
人工智能AI技术2 小时前
AI编程工具测评:2026年该选Copilot、Cursor还是免费开源方案?
人工智能