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

news2024/9/20 9:39:30

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

 设置QT路径

 

打开vs2022 ,选择Qt Widgets Application

 

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

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

修改头文件,增加2行,

private slots:
    void on_buttonOpen_clicked();

以及修改最后1行如图 

Ui::QtWidgetsApplication1Class *ui;

 

修改主文件cpp之前,先加载配置好的opencv属性表(这个是vs2022中配置opencv的问题,这里不详细展开,主要讲vs中qt的使用)

 

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

 修改后的内容如下

#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中

 

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); 

}

 到这一步,基本功能就完成,可以先生成项目,再运行看下

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

没意外的话,图片会显示在Label中,现在处理下标题乱码问题

 .

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

 至此,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); 

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1957452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学建模--差值算法

目录 插值方法的种类 应用实例 编程实现 算法实现 拉格朗日插值算法 ​编辑 多项式差值算法 样条插值 牛顿插值算法 插值算法在数据预测中的最新应用和案例研究是什么&#xff1f; 如何比较不同插值方法&#xff08;如线性插值、多项式插值&#xff09;在实际工程问…

bjtu数据库课程设计--基于Spring Boot框架的门店点餐系统

一、安装与配置 1 安装与配置 下载IntelliJ IDEA&#xff0c;需要下载安装jdk1.8.0_152&#xff0c;安装tomcat-9.0.88&#xff0c;安装MySQL8.0数据库。安装成功后打开IntelliJ IDEA&#xff0c;使用 Spring Boot 2.6.13框架&#xff0c;服务器URL窗口使用start.aliyun.com&a…

AI副业玩法:开启你的智能赚钱之路

在这个数码时代&#xff0c;人工智能&#xff08;AI&#xff09;已经不仅仅是科技巨头的专利&#xff0c;它逐渐渗透到我们生活的方方面面。如今&#xff0c;越来越多的人开始利用AI技术进行副业尝试&#xff0c;既拓宽了收入来源&#xff0c;也提升了自我技能。那么&#xff0…

【前端 07】JavaScript中的数组对象

JavaScript中的数组对象 在JavaScript中&#xff0c;数组&#xff08;Array&#xff09;对象是一种非常基础且强大的数据结构&#xff0c;用于在单个变量中存储多个值。这些值可以是任何数据类型&#xff0c;包括数字、字符串、甚至是其他数组&#xff08;多维数组&#xff09…

实验2-4-2 求N分之一序列前N项和**注意小细节

//实验2-4-2 求N分之一序列前N项和//计算序列 1 1/2 1/3 ... 的前N项之和。#include<stdio.h> #include<math.h> int main(){int N;double sum0.0;scanf("%d",&N);for(int a1;a<N;a)sum(1.0/a);//这里必须是1.0 不可以是1&#xff01;&#x…

【管理咨询宝藏150】MBB咨询顾问的结构化PPT训练课程

【管理咨询宝藏150】MBB咨询顾问的结构化PPT训练课程 【格式】PDF版本 【关键词】MBB、麦肯锡、罗兰贝格、咨询顾问 【核心观点】 - 在项目的开始阶段你着手发展有效的金字塔式的演示文稿—我们的重点在最后两个步骤&#xff1b;我们用金字塔结构&#xff1a;通过把核心的信息…

使用nginx解决本地环境访问线上接口跨域问题

前言 前端项目开发过程中&#xff0c;经常会遇到各种各样的跨域问题。 虽然大部分时候&#xff0c;由脚手架自带的proxy功能即可解决问题&#xff0c;如webpack&#xff0c;vite等&#xff1b;但是若没有通过脚手架搭建项目&#xff0c;或者必须使用某些特殊规则转发时&#…

<数据集>手机识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;16172张 标注数量(xml文件个数)&#xff1a;16172 标注数量(txt文件个数)&#xff1a;16172 标注类别数&#xff1a;1 标注类别名称&#xff1a;[Phone] 使用标注工具&#xff1a;labelImg 标注规则&#xff1a;…

【QT】qt 文件操作

qt 文件 qt 文件1. Qt 文件概述2. 输入输出设备类3. 文件读写类4. 文件和目录信息类 qt 文件 1. Qt 文件概述 文件操作是应用程序必不可少的部分。Qt 作为⼀个通用开发库&#xff0c;提供了跨平台的文件操作能力。 Qt 提供了很多关于文件的类&#xff0c;通过这些类能够对文件…

上海有机所化学数据库:一站式科研资源

上海有机化学研究所是中国科学院上海分院的直属机构&#xff0c;主要从事有机化学、材料化学、生命科学等领域的基础研究和应用研究&#xff0c;化学专业数据库是该所承担建设的综合科技信息数据库的重要组成部分&#xff0c;服务于化学化工研究和开发的综合性信息系统&#xf…

Javaweb项目|springboot医院管理系统

收藏点赞不迷路 关注作者有好处 文末获取源码 一、系统展示 二、万字文档展示 基于springboot医院管理系统 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringSpringMVCMyBatisVue 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 编号&#xff1a;…

【海贼王航海日志:前端技术探索】HTML你学会了吗?(一)

目录 1 -> HTML概念 2 -> HTML结构 2.1 -> 认识HTML标签 2.2 -> HTML文件基本结构 2.3 -> 标签层次结构 3 -> 快速生成代码框架 4 -> HTML常见标签 4.1 -> 注释标签 4.2 -> 标题标签 4.3 -> 段落标签 4.4 -> 换行标签 4.5 ->…

多线程-进阶2

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 1.CAS 1.1CAS全称:Compare and swap 比较内存和cpu寄存器中的内容,如果发现相同,就进行交换(交换的是内存和另一个寄存器的内容) 一个内存的…

《学会 SpringBoot · 参数校验》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

连锁美业门店收银系统Java源码-如何设置门店仓库自提时间?博弈美业实操

1. 门店仓库自提时间&#xff0c;是当客户在小程序上购买实物商品时&#xff0c;预约上门提货的时间 2. 门店仓库自提时间&#xff0c;需要由各门店&#xff08;店主、店长、店员&#xff09;在PAD上进行设置 ▶ 操作路径&#xff1a; • 第一步&#xff1a; 进入【我的】页…

怎么进行图片压缩?对图片文件的大小进行压缩的四个方法介绍

怎么进行图片压缩&#xff1f;图片压缩是一种常见的技术&#xff0c;用于减小图像文件的大小&#xff0c;同时尽可能地保持图像的视觉质量和细节。这一过程不仅适用于个人用户想要节省存储空间或提高网页加载速度&#xff0c;也对于专业摄影师、网站设计师和应用程序开发者来说…

【OceanBase诊断调优】—— clog盘满问题排查

背景 日志盘&#xff0c;即clog盘&#xff0c;是oceanbase中用于记录事务日志信息。在日常运行中其存储量会随着事务处理情况不断变化。在一些特殊场景下会出现clog盘占用量超过阈值的情况。4.x架构下的clog盘&#xff0c;日志盘进行了租户级拆分&#xff0c;意味着无法再以3.…

Redis缓存数据库进阶——Redis缓存数据同步问题(8)

Redis缓存使用问题 数据一致性 只要使用到缓存&#xff0c;无论是本地内存做缓存还是使用 redis 做缓存&#xff0c;那么就会存在数据同步的问题。 我以 Tomcat 向 MySQL 中写入和删改数据为例&#xff0c;来给你解释一下&#xff0c;数据的增删改操作具体是如何进行的。 我…

Java中的集合相关知识汇总

总结 Java集合 从数据结构可以分为&#xff1a;数组、Set、Map、队列、栈&#xff1b;从多线程安全可以分为线程安全与非线程安全的集合从关联关系可以总结如下(不包含多线程安全类)&#xff1a; 点线框表示接口&#xff1b; 折线框表示抽象类&#xff1b; 实线框表示实现类…

动态代理IP VS 静态代理IP,分别适合什么业务场景?

随着全球化进程的加深&#xff0c;使用IP代理服务的用户与日俱增。本文以“动态IP代理与静态IP代理”为探讨话题&#xff0c;对它们之间的区别、特点与应用场景作深度的对比分析。 一、含义上的区别 动态IP代理&#xff1a;互联网服务提供商&#xff08;ISP&#xff09;向用户…