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

打印 上一主题 下一主题

主题 534|帖子 534|积分 1602

要在vs2022创建QT项目,先要安装一个插件Qt Visual Studio Tools,根据个人经验选择LEGACY Qt Visual Studio Tools好一些,看以下内容之前建议先在vs2022中配置好opencv,配置方式建议以属性表的情势生存在硬盘上。

 设置QT路径
 


打开vs2022 ,选择Qt Widgets Application
 

这里不清晰为什么只能选择一个,就默认Next吧

 点Finish后如下图所示,双击ui文件


修改头文件,增加2行,
  1. private slots:
  2.     void on_buttonOpen_clicked();
复制代码
以及修改最后1行如图 
  1. Ui::QtWidgetsApplication1Class *ui;
复制代码
 
修改主文件cpp之前,先加载配置好的opencv属性表(这个是vs2022中配置opencv的题目,这里不具体展开,主要讲vs中qt的利用)
 

opencv的属性表加载之后,就可以调用opencv功能了,QtWidgetsApplication1.cpp头部增加以下代码

 修改后的内容如下
  1. #include "qtpro2.h"
  2. #include <QFileDialog>
  3. #include <QMessageBox>
  4. #include <QPixmap>
  5. #include <opencv2/opencv.hpp>
  6. #include <opencv2/imgproc.hpp>
  7. using namespace cv;
  8. using namespace std;
  9. qtpro2::qtpro2(QWidget *parent)
  10.     : QMainWindow(parent), ui(new Ui::qtpro2Class)
  11. {
  12.     //ui.setupUi(this);
  13.         ui->setupUi(this);
  14. }
复制代码
给打开图片这个按钮加上代码,功能是读取一张图片,并等比例(稳固形)缩放后体现在Qlabel中
 
  1. Mat img_input;
  2. void QtWidgetsApplication1::on_pushButton_clicked()
  3. {
  4.     QString filename = QFileDialog::getOpenFileName(this, "打开图像文件", "C:/Users", "Image Files (*.bmp;*.png;*.jpg)");
  5.     if (filename.isEmpty()) {
  6.         QMessageBox::information(this, "提示", "文件打开失败1!");
  7.         return;
  8.     }
  9.     img_input = cv::imread(filename.toLocal8Bit().toStdString());
  10.     if (img_input.empty()) {
  11.         QMessageBox::information(this, "提示", "文件打开失败2!");
  12.         return;
  13.     }
  14.     cv::Mat temp;
  15.     cv::cvtColor(img_input, temp, cv::COLOR_BGR2RGB);
  16.     // 直接将文件名传递给 QPixmap 进行加载
  17.     QPixmap pixmap = QPixmap::fromImage(QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888));
  18.     if (pixmap.isNull()) {
  19.         QMessageBox::information(this, "提示", "文件打开失败2!");
  20.         return;
  21.     }
  22.     // 获取 label 的尺寸
  23.     int labelWidth = ui->labelPic->width();
  24.     int labelHeight = ui->labelPic->height();
  25.     // 将 QPixmap 进行缩放
  26.     QPixmap scaledPixmap = pixmap.scaled(labelWidth, labelHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
  27.     // 将缩放后的图像设置到 label 中
  28.     ui->labelPic->setPixmap(scaledPixmap);
  29.     ui->labelPic->setScaledContents(false);
  30.     ui->labelPic->setAlignment(Qt::AlignCenter);
  31. }
复制代码
 到这一步,基本功能就完成,可以先生成项目,再运行看下


运行之后 ,可以看到可以选择图片了,不过窗口标题中文乱码

没不测的话,图片会体现在Label中,现在处理下标题乱码题目
 .

生存之后,要重新生成,再运行,我这里是生效了

 至此,vs20022中利用qt调用opencv,从0到1的跨越应该是成功了,后面假如时间答应,再加一些图片处理的功能,像锐化,素描化并生存的功能,渴望对新手有点点帮助哈
QtWidgetsApplication1.cpp 全部代码
  1. #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;
  2. void QtWidgetsApplication1::on_pushButton_clicked()
  3. {
  4.     QString filename = QFileDialog::getOpenFileName(this, "打开图像文件", "C:/Users", "Image Files (*.bmp;*.png;*.jpg)");
  5.     if (filename.isEmpty()) {
  6.         QMessageBox::information(this, "提示", "文件打开失败1!");
  7.         return;
  8.     }
  9.     img_input = cv::imread(filename.toLocal8Bit().toStdString());
  10.     if (img_input.empty()) {
  11.         QMessageBox::information(this, "提示", "文件打开失败2!");
  12.         return;
  13.     }
  14.     cv::Mat temp;
  15.     cv::cvtColor(img_input, temp, cv::COLOR_BGR2RGB);
  16.     // 直接将文件名传递给 QPixmap 进行加载
  17.     QPixmap pixmap = QPixmap::fromImage(QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888));
  18.     if (pixmap.isNull()) {
  19.         QMessageBox::information(this, "提示", "文件打开失败2!");
  20.         return;
  21.     }
  22.     // 获取 label 的尺寸
  23.     int labelWidth = ui->labelPic->width();
  24.     int labelHeight = ui->labelPic->height();
  25.     // 将 QPixmap 进行缩放
  26.     QPixmap scaledPixmap = pixmap.scaled(labelWidth, labelHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
  27.     // 将缩放后的图像设置到 label 中
  28.     ui->labelPic->setPixmap(scaledPixmap);
  29.     ui->labelPic->setScaledContents(false);
  30.     ui->labelPic->setAlignment(Qt::AlignCenter);
  31. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表