1.显示在graphicsView控件上
.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include //1.声明头文件
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
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
#include "opencv2/opencv.hpp"
using namespace cv;
//#include
//#include
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
//#include
//#include
//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);
//});
//}