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
英文地址,請注明出處:http://en.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;相對西面正在…