10.OpenCV—联合QT界面显示

1.显示在graphicsView控件上

.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>#include <QGraphicsPixmapItem>  //1.声明头文件
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();void testOpenCV();private slots:void on_pushButton_clicked();private:Ui::MainWindow *ui;// 2.创建场景和像素图项QGraphicsScene* scene;
};#endif // MAINWINDOW_H

.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <qdebug.h>
#include "opencv2/opencv.hpp"using namespace cv;//#include <QImage>
//#include <QPixmap>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);testOpenCV(); // 新增调用// 2.创建场景和像素图项scene = new QGraphicsScene();}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{// 3.读取OpenCV图像Mat src = imread("1.jpg");if (src.empty()) return;  // 检查图像是否加载成功// 4.将BGR格式转换为RGB格式Mat rgb;cvtColor(src, rgb, cv::COLOR_BGR2RGB);// 5.创建QImage并确保深拷贝数据QImage img(rgb.data,             // 数据指针rgb.cols,             // 宽度rgb.rows,             // 高度rgb.step,             // 每行字节数QImage::Format_RGB888 // RGB888格式);//6.QImage imageCopy = img.copy(); // 深拷贝以避免数据失效// 7.清除旧场景并设置新场景if (ui->graphicsView->scene()) {delete ui->graphicsView->scene(); // 删除旧场景防止内存泄漏}//8.将图像添加到场景中scene->addPixmap(QPixmap::fromImage(img));scene->setSceneRect(0, 0, img.width(), img.height());//9.在控件上显示ui->graphicsView->setScene(scene);}//模板匹配程序
void MainWindow:: testOpenCV()
{
//    cv::Mat img = cv::imread("1.jpg");
//    if(!img.empty()) {
//        qDebug() << "OpenCV配置成功!图像尺寸:"
//                 << img.cols << "x" << img.rows;
//        cv::imshow("Display", img);
//        cv::waitKey(0);
//    } else {
//        qDebug() << "加载图片失败!";
//    }//    // 读取待测图像
//    Mat image = imread("1.jpg");
//    // 读取模板图像
//    Mat templ = imread("3.jpg");
//    // 定义匹配结果变量
//    Mat result;
//    // 创建一个基于待测图像(W-w+1) * (H-h+1)
//    int cols = image.cols - templ.cols + 1;
//    int rows = image.rows - templ.rows + 1;
//    // 创建了一个32位浮点型单通道的矩阵
//    result.create(cols, rows, CV_32FC1);//    // 调用模板匹配的函数
//    matchTemplate(image, templ, result, CV_TM_SQDIFF);//    // 对匹配结果进行归一化操作
//    normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());
//    double minVal = -1;
//    double maxVal = 0;
//    Point minLoc;
//    Point maxLoc;
//    Point matchLoc;
//    // 获取最小指针值
//    minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
//    qDebug() << "匹配度为:" << minVal << endl;
//    // 给匹配位置变量赋值
//    matchLoc = minLoc;
//    // 绘制匹配矩形
//    rectangle(image, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 255, 0), 2, 8, 0);//    // 把绘制后的结果显示
//    namedWindow("匹配后图像显示窗口", WINDOW_AUTOSIZE);
//    imshow("匹配后图像显示窗口", image);
//    waitKey(0);
}//显示参考程序
//{
//#include <QGraphicsPixmapItem>
//#include <QImage>
//#include <QPixmap>//connect(ui->pushButton, &QPushButton::clicked, [&]() {
//    // 读取OpenCV图像
//    cv::Mat src = cv::imread("1.jpg");
//    if (src.empty()) return;  // 检查图像是否加载成功//    // 将BGR格式转换为RGB格式
//    cv::Mat rgb;
//    cv::cvtColor(src, rgb, cv::COLOR_BGR2RGB);//    // 创建QImage并确保深拷贝数据
//    QImage img(
//        rgb.data,             // 数据指针
//        rgb.cols,             // 宽度
//        rgb.rows,             // 高度
//        rgb.step,             // 每行字节数
//        QImage::Format_RGB888 // RGB888格式
//    );
//    QImage imageCopy = img.copy(); // 深拷贝以避免数据失效//    // 创建场景和像素图项
//    QGraphicsScene* scene = new QGraphicsScene();
//    QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(imageCopy));
//    scene->addItem(item);//    // 清除旧场景并设置新场景
//    if (ui->graphicsView->scene()) {
//        delete ui->graphicsView->scene(); // 删除旧场景防止内存泄漏
//    }
//    ui->graphicsView->setScene(scene);//    // 自适应缩放显示
//    ui->graphicsView->fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio);
//});
//}







附录(改进版)

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>#include <QGraphicsPixmapItem>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();void testOpenCV();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::MainWindow *ui;// 创建场景和像素图项QGraphicsScene* scene;
};#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <qdebug.h>
#include "opencv2/opencv.hpp"using namespace cv;
#include <QFileDialog>//#include <QImage>
//#include <QPixmap>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);testOpenCV(); // 新增调用// 2.创建场景和像素图项scene = new QGraphicsScene();}MainWindow::~MainWindow()
{delete ui;
}//graphicsView控件
void MainWindow::on_pushButton_clicked()
{// 3.直接读取OpenCV图像// Mat src = imread("1.jpg");//  if (src.empty()) return;  // 检查图像是否加载成功//3.打开图像QString fileName = QFileDialog::getOpenFileName(this, "Open Image", "", "Image Files (*.png *.jpg *.bmp)");if (!fileName.isEmpty()) {Mat  src = imread(fileName.toStdString());if (!src.empty()) {// 4.将BGR格式转换为RGB格式Mat rgb;cvtColor(src, rgb, cv::COLOR_BGR2RGB);// 5.创建QImage并确保深拷贝数据QImage img(rgb.data,             // 数据指针rgb.cols,             // 宽度rgb.rows,             // 高度rgb.step,             // 每行字节数QImage::Format_RGB888 // RGB888格式);// QImage imageCopy = img.copy(); // 6.深拷贝以避免数据失效// 7.清除旧场景并设置新场景if (ui->graphicsView->scene()) {delete ui->graphicsView->scene(); // 删除旧场景防止内存泄漏}//8.将图像添加到场景中scene->addPixmap(QPixmap::fromImage(img));scene->setSceneRect(0, 0, img.width(), img.height());//9.在控件上显示ui->graphicsView->setScene(scene);}}}//lable控件
void MainWindow::on_pushButton_2_clicked()
{QString fileName = QFileDialog::getOpenFileName(this, "Open Image", "", "Image Files (*.png *.jpg *.bmp)");if (!fileName.isEmpty()) {Mat   image = imread(fileName.toStdString());if (!image.empty()) {// displayImage(image);QImage qimg(image.data, image.cols, image.rows, image.step, QImage::Format_RGB888);ui->label->setPixmap(QPixmap::fromImage(qimg.rgbSwapped()));}}}//void displayImage(const Mat &img) {
//    QImage qimg(img.data, img.cols, img.rows, img.step, QImage::Format_RGB888);
//    imageLabel->setPixmap(QPixmap::fromImage(qimg.rgbSwapped()));
//}//模板匹配程序
void MainWindow:: testOpenCV()
{
//    cv::Mat img = cv::imread("1.jpg");
//    if(!img.empty()) {
//        qDebug() << "OpenCV配置成功!图像尺寸:"
//                 << img.cols << "x" << img.rows;
//        cv::imshow("Display", img);
//        cv::waitKey(0);
//    } else {
//        qDebug() << "加载图片失败!";
//    }//    // 读取待测图像
//    Mat image = imread("1.jpg");
//    // 读取模板图像
//    Mat templ = imread("3.jpg");
//    // 定义匹配结果变量
//    Mat result;
//    // 创建一个基于待测图像(W-w+1) * (H-h+1)
//    int cols = image.cols - templ.cols + 1;
//    int rows = image.rows - templ.rows + 1;
//    // 创建了一个32位浮点型单通道的矩阵
//    result.create(cols, rows, CV_32FC1);//    // 调用模板匹配的函数
//    matchTemplate(image, templ, result, CV_TM_SQDIFF);//    // 对匹配结果进行归一化操作
//    normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());
//    double minVal = -1;
//    double maxVal = 0;
//    Point minLoc;
//    Point maxLoc;
//    Point matchLoc;
//    // 获取最小指针值
//    minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
//    qDebug() << "匹配度为:" << minVal << endl;
//    // 给匹配位置变量赋值
//    matchLoc = minLoc;
//    // 绘制匹配矩形
//    rectangle(image, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 255, 0), 2, 8, 0);//    // 把绘制后的结果显示
//    namedWindow("匹配后图像显示窗口", WINDOW_AUTOSIZE);
//    imshow("匹配后图像显示窗口", image);
//    waitKey(0);
}//显示参考程序
//{
//#include <QGraphicsPixmapItem>
//#include <QImage>
//#include <QPixmap>//connect(ui->pushButton, &QPushButton::clicked, [&]() {
//    // 读取OpenCV图像
//    cv::Mat src = cv::imread("1.jpg");
//    if (src.empty()) return;  // 检查图像是否加载成功//    // 将BGR格式转换为RGB格式
//    cv::Mat rgb;
//    cv::cvtColor(src, rgb, cv::COLOR_BGR2RGB);//    // 创建QImage并确保深拷贝数据
//    QImage img(
//        rgb.data,             // 数据指针
//        rgb.cols,             // 宽度
//        rgb.rows,             // 高度
//        rgb.step,             // 每行字节数
//        QImage::Format_RGB888 // RGB888格式
//    );
//    QImage imageCopy = img.copy(); // 深拷贝以避免数据失效//    // 创建场景和像素图项
//    QGraphicsScene* scene = new QGraphicsScene();
//    QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(imageCopy));
//    scene->addItem(item);//    // 清除旧场景并设置新场景
//    if (ui->graphicsView->scene()) {
//        delete ui->graphicsView->scene(); // 删除旧场景防止内存泄漏
//    }
//    ui->graphicsView->setScene(scene);//    // 自适应缩放显示
//    ui->graphicsView->fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio);
//});
//}

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

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

相关文章

ChromaDB深度技术研究报告

第一章: ChromaDB核心概念与架构 1.1 向量数据库:新一代AI应用基石 向量数据库是为存储、管理和搜索向量嵌入(Vector Embeddings)而专门设计的数据库系统。在高维空间中,向量嵌入是数据(如文本、图片、音频等)的数值表示。向量数据库的核心能力在于,它能够高效地执行相…

react 自定义状态管理库

核心实现原理 &#xff1a; 全局状态容器&#xff1a;维护单一状态源 订阅机制&#xff1a;组件订阅状态变化 状态更新调度&#xff1a;通过 Hooks 触发组件重渲染 基础版实现–核心代码 // 1. 创建全局状态存储 const createStore (initialState) > {let state initial…

解决idea无法正常加载lombok包

问题 近期发现了一个问题&#xff0c;就是很多同学在导包的&#xff0c;lombok经常会爆红&#xff0c;经过研究找到了解决方法。 解决 1、更改lombok包的版本 通过手动调整pom.xml文件的lombok&#xff0c;通常讲版本调整为1.18.20&#xff0c;或者1.18.32。 <dependenc…

0_1树和图

树的概念 树(tree)是一种能够分层存储数据的重要数据结构,树中的每个元素被称为树的节点,每个节点有若干个指针指向子节点。从节点的角度来看,树是由唯一的起始节点引出的节点集合。这个起始结点称为根(root)。树中节点的子树数目称为节点的度(degree)。在面试中,关于树的…

从0搭建出海 Demo:免费香港服务器实战指南

你有没有在通勤地铁上、午饭后摸鱼时&#xff0c;突然冒出一个想法&#xff1a;“要不我也做个应用试试&#xff1f;好像不少人靠这个补贴生活开销啊&#xff01;” 结果随手搜了几篇“海外项目经验分享”&#xff0c;瞬间被一堆术语劝退&#xff1a;CDN、备案、分发平台、服务…

《仿盒马》app开发技术分享--未完成订单列表展示逻辑优化(61)

技术栈 Appgallery connect 前言&#xff1a; 上一节我们实现订单与优惠券的联合提交时&#xff0c;我去到订单列表页面查看生成的订单信息&#xff0c;发现现在的订单从信息展示到价格计算全都是有问题的。所以紧急的把对应的问题修改一下。 问题来源&#xff1a; async …

手搓多模态-08 主模型的搭建(上)

前情回顾 在之前的章节我们已经构建好了视觉编码器&#xff0c;预处理模块&#xff0c;以及gemma模型的顶层。gemma模型的顶层&#xff0c;主要是构建图中圈出的输入&#xff0c;它把视觉编码器里每个图像patch的编码维度对齐到自然语言token的嵌入维度&#xff0c;并组装成了一…

Matlab 角点探测

文章目录 一、简介二、实现代码三、实现效果一、简介 这里实现一种角点探测功能,其思路仍然是借助图像的局部梯度信息,实现亚像素精度的角点定位。该功能核心思想是利用角点周围的局部梯度信息,通过加权最小二乘优化的方式迭代调整角点位置,使定位精度达到亚像素级别。整个…

错误监控----比如实现sentry一些思路

错误监控 ⼀、引⾔ 1.为什么需要前端错误监控 你的脚本在哪些边界条件下会报错&#xff1f; 你的脚本和样式兼容性如何&#xff1f; 有哪些地区不能正常访问你的⽹站&#xff1f; 出现问题之后&#xff0c;你如何快速定位排查&#xff0c;把损失降到最低&#xff1f; 如果你想解…

linux内核调试

1. 前置安装 1.1 编译好的内核 参考&#xff1a; https://blog.csdn.net/qq_51950769/article/details/148596916 1.2 编译busybox BusyBox 是一个非常轻量级的多合一工具箱&#xff0c;常被称为“Linux 的瑞士军刀”。 简单来说&#xff1a; 它把很多常用的 Linux 命令&am…

什么是曲面细分

什么是曲面细分 在CAD格式中&#xff0c;通常使用曲线和数学函数来定义曲面和实体。这些曲面的精确度和光滑度非常适用于制造过程。但是&#xff0c;现代GPU芯片针对由三角形网格体组成的曲面的渲染计算进行了高度优化。通常&#xff0c;实时渲染器和虚幻之类的游戏引擎只能处…

CANFD加速是什么?和CANFD有什么区别?

文章目录 摘要什么是CANFD加速?CAN FD的基本原理:仲裁阶段(Arbitration Phase):数据阶段(Data Phase):关键特性:优势:总结摘要 下面的截图,大家肯定不陌生,在使用CAN设备上位机的时候,已经选择了CANFD,但还有一个选项是“CANFD加速”,那CANFD加速和不加速有什么…

minio 启动失败--Incorrect Usage: flag provided but not defined: -consoleaddress

根据错误信息 flag provided but not defined: -consoleaddress&#xff0c;这表明 Minio 服务启动时使用了未定义的命令行参数 --consoleaddress&#xff0c;导致启动失败。这个问题与 Minio 版本兼容性有关。 问题原因 参数名称变更&#xff1a; Minio 版本 > RELEASE.20…

基于Rust的Polars学习笔记

基于Rust的Polars学习笔记 Polars 学习笔记 Cargo.toml通用配置 [package] name = "rustP" version = "0.1.0" edition = "2024"[dependencies] polars = { version = "0.48.1", features = ["full"]}Quickstart use po…

SpringBoot扩展——定时任务!

定时任务 项目开发中会涉及很多需要定时执行的代码&#xff0c;如每日凌晨对前一日的数据进行汇总&#xff0c;或者系统缓存的清理、对每日的数据进行分析和总结等需求&#xff0c;这些都是定时任务。单体系统和分布式系统的分布式任务有很大的区别&#xff0c;单体系统就一个…

RTDETRv2 pytorch 官方版自己数据集训练遇到的问题解决

rtdetrv2 训练问题遇到的问题。 pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2 --index-url https://download.pytorch.org/whl/cu117 1 Please make sure torchvision version > 0.15.2 发现自己实际装的是 torchvison0.15.2cu117 修改_misc.py中修改为…

Linux系统移植⑤:uboot启动流程详解-board_init_f执行过程

Linux系统移植⑤&#xff1a;uboot启动流程详解-board_init_f执行过程 _main 中会调用 board_init_f 函数。 board_init_f 函数主要有两个工作&#xff1a; ①初始化一系列外设&#xff0c;比如串口、定时器&#xff0c;或者打印一些消息等。 ②初始化 gd 的各个成员变量&am…

Git命令与代码仓库管理

步骤一、完成Gitee码云上账号注册并新建代码仓库。 1.1 新建代码仓库 1.2 填写信息并创建 1.3 获取仓库地址 https://gitee.com/dog-kidney/2022082206.git 步骤二、建立本地代码仓库&#xff0c;并连接到远程代码仓库。 2.1初始化 git init 2.2添加仓库 git remote add o…

资源占用多,Linux 系统中如何降低 CPU 资源消耗并提升利用率?

在 Linux 系统中降低 CPU 资源消耗并提升利用率,需从系统服务优化、进程管理、资源调度及内核参数调整等多维度入手。以下是适用于各类 Linux 发行版的通用优化方案,涵盖基础操作与进阶策略: 一、服务与进程优化:减少无效资源占用 1. 关闭冗余系统服务 查看运行中的服务 …

技术与情感交织的一生 (八)

目录 融合 东西厂公 接风宴 头痛 “巴巴罗萨” 突击 推进 助攻 96小时 寒冬 食堂 反攻 消耗 Delphi 西厂 内困 外患 “敦刻尔克” 多线作战 大撤退 资源 融合 东西厂公 初次来到纸箱厂&#xff0c;是主厂区&#xff0c;感觉很大&#xff0c;相对西面正在…