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