罪恶克星 发表于 2024-7-30 03:33:30

Vs2022+QT+Opencv 一些需要留意的地方

要在vs2022创建QT项目,先要安装一个插件Qt Visual Studio Tools,根据个人经验选择LEGACY Qt Visual Studio Tools好一些,看以下内容之前建议先在vs2022中配置好opencv,配置方式建议以属性表的情势生存在硬盘上。
https://i-blog.csdnimg.cn/direct/f15d343eb1854a8e80366f8e9c6672ee.png
 设置QT路径
https://i-blog.csdnimg.cn/direct/ab493b40a3f9476f9fc9237cd397e378.png 
https://i-blog.csdnimg.cn/direct/ec46660ccca94a2cb4b92c13749d46a0.png
打开vs2022 ,选择Qt Widgets Application
https://i-blog.csdnimg.cn/direct/bddf475d075849778f530324398e4a3b.png 
https://i-blog.csdnimg.cn/direct/4b4e42e1531d4b90b5eb9250c8022960.pnghttps://i-blog.csdnimg.cn/direct/7215cb9b894a42e188064872f7728d6f.png
这里不清晰为什么只能选择一个,就默认Next吧
https://i-blog.csdnimg.cn/direct/4522b07dcdbd4b2ba368bf8052e57282.png
https://i-blog.csdnimg.cn/direct/c8b5e457a58349e78965b60190ea03f4.png 点Finish后如下图所示,双击ui文件
https://i-blog.csdnimg.cn/direct/21b1d8f46e6b4e389038e3cf62f44414.png
https://i-blog.csdnimg.cn/direct/b2702ff150d94c718f14823be6c78798.pnghttps://i-blog.csdnimg.cn/direct/48e6ac86b6264ecda50fea79bd1ee750.pnghttps://i-blog.csdnimg.cn/direct/28df4d1dbc7246fca0d890a0b42ffa42.png
修改头文件,增加2行,
private slots:
    void on_buttonOpen_clicked(); 以及修改最后1行如图 
Ui::QtWidgetsApplication1Class *ui; https://i-blog.csdnimg.cn/direct/fa2854b9d1954a008819cca22eb6b970.png 
修改主文件cpp之前,先加载配置好的opencv属性表(这个是vs2022中配置opencv的题目,这里不具体展开,主要讲vs中qt的利用)
 https://i-blog.csdnimg.cn/direct/c1a0625e40ab4813bfed755255865687.png
opencv的属性表加载之后,就可以调用opencv功能了,QtWidgetsApplication1.cpp头部增加以下代码
https://i-blog.csdnimg.cn/direct/86b8141418d54a7388e73b19037b3199.png
 修改后的内容如下
#include "qtpro2.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QPixmap>

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>

using namespace cv;
using namespace std;

qtpro2::qtpro2(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::qtpro2Class)
{
    //ui.setupUi(this);
        ui->setupUi(this);
} 给打开图片这个按钮加上代码,功能是读取一张图片,并等比例(稳固形)缩放后体现在Qlabel中
https://i-blog.csdnimg.cn/direct/1df74e7aea7945faba91c77cd5679566.png 
Mat img_input;
void QtWidgetsApplication1::on_pushButton_clicked()
{

    QString filename = QFileDialog::getOpenFileName(this, "打开图像文件", "C:/Users", "Image Files (*.bmp;*.png;*.jpg)");

    if (filename.isEmpty()) {
      QMessageBox::information(this, "提示", "文件打开失败1!");
      return;
    }

    img_input = cv::imread(filename.toLocal8Bit().toStdString());

    if (img_input.empty()) {

      QMessageBox::information(this, "提示", "文件打开失败2!");
      return;
    }

    cv::Mat temp;
    cv::cvtColor(img_input, temp, cv::COLOR_BGR2RGB);

    // 直接将文件名传递给 QPixmap 进行加载
    QPixmap pixmap = QPixmap::fromImage(QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888));

    if (pixmap.isNull()) {
      QMessageBox::information(this, "提示", "文件打开失败2!");
      return;
    }

    // 获取 label 的尺寸
    int labelWidth = ui->labelPic->width();
    int labelHeight = ui->labelPic->height();

    // 将 QPixmap 进行缩放
    QPixmap scaledPixmap = pixmap.scaled(labelWidth, labelHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);

    // 将缩放后的图像设置到 label 中
    ui->labelPic->setPixmap(scaledPixmap);
    ui->labelPic->setScaledContents(false);
    ui->labelPic->setAlignment(Qt::AlignCenter);

}  到这一步,基本功能就完成,可以先生成项目,再运行看下
https://i-blog.csdnimg.cn/direct/f5c9db1f64e1423ebafc5d0bd7d4d06e.png
https://i-blog.csdnimg.cn/direct/8cc48938f2cd4e809688d379029f697b.png
运行之后 ,可以看到可以选择图片了,不过窗口标题中文乱码
https://i-blog.csdnimg.cn/direct/9aef6909c4174cde827737424e370072.png
没不测的话,图片会体现在Label中,现在处理下标题乱码题目
https://i-blog.csdnimg.cn/direct/bfdfc03e8fad4faa875cde4b9d70dd7c.png .
https://i-blog.csdnimg.cn/direct/545b5b4360e1433ba466a85ffb2a5e01.png
生存之后,要重新生成,再运行,我这里是生效了
https://i-blog.csdnimg.cn/direct/ef0c3c5cbbc849deae59ddb7f915f833.png
 至此,vs20022中利用qt调用opencv,从0到1的跨越应该是成功了,后面假如时间答应,再加一些图片处理的功能,像锐化,素描化并生存的功能,渴望对新手有点点帮助哈
QtWidgetsApplication1.cpp 全部代码
#include "QtWidgetsApplication1.h"#include <QFileDialog>#include <QMessageBox>#include <QPixmap>#include <opencv2/opencv.hpp>#include <opencv2/imgproc.hpp>using namespace cv;using namespace std;QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)    : QMainWindow(parent) ,ui(new Ui::QtWidgetsApplication1Class){    //ui.setupUi(this);//修改前    ui->setupUi(this);//修改后}QtWidgetsApplication1::~QtWidgetsApplication1(){}Mat img_input;
void QtWidgetsApplication1::on_pushButton_clicked()
{

    QString filename = QFileDialog::getOpenFileName(this, "打开图像文件", "C:/Users", "Image Files (*.bmp;*.png;*.jpg)");

    if (filename.isEmpty()) {
      QMessageBox::information(this, "提示", "文件打开失败1!");
      return;
    }

    img_input = cv::imread(filename.toLocal8Bit().toStdString());

    if (img_input.empty()) {

      QMessageBox::information(this, "提示", "文件打开失败2!");
      return;
    }

    cv::Mat temp;
    cv::cvtColor(img_input, temp, cv::COLOR_BGR2RGB);

    // 直接将文件名传递给 QPixmap 进行加载
    QPixmap pixmap = QPixmap::fromImage(QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888));

    if (pixmap.isNull()) {
      QMessageBox::information(this, "提示", "文件打开失败2!");
      return;
    }

    // 获取 label 的尺寸
    int labelWidth = ui->labelPic->width();
    int labelHeight = ui->labelPic->height();

    // 将 QPixmap 进行缩放
    QPixmap scaledPixmap = pixmap.scaled(labelWidth, labelHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);

    // 将缩放后的图像设置到 label 中
    ui->labelPic->setPixmap(scaledPixmap);
    ui->labelPic->setScaledContents(false);
    ui->labelPic->setAlignment(Qt::AlignCenter);

}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Vs2022+QT+Opencv 一些需要留意的地方