目录
问题描述
最近想读取图片并显示到QLabel和GraphicsView上,但是出现运行程序后发现不对劲,其效果如下:
原图片:
Qt显示效果
问题分析与解决办法
Mat和QImage的数据不相互对应,如果从Mat转换到QImage的过程中参数设置不对,数据就会出问题
在QImage中增加step的参数即可
QImage disImage_1 = QImage((const unsigned char*)(srcImage_1.data), srcImage_1.cols, srcImage_1.rows,srcImage_1.step, QImage::Format_RGB888);
完整代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDebug"
#include "QString"
#include "QGraphicsScene"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 右斜杠可以通过一定设置找到你存放资源的路径, path = QCoreApplication::applicationDirPath() + "/src/images"
// Mat image=imread("E:/My_Files/Practice_Projects/Qt/Practice/Qt_Opencv_Model/src/imges/keji.jpeg",1);//一定要使用绝对路径,其他可以回报错
// QString 和 String相互转换
// QString qstr;
// string str;
// str = qstr.toStdString();
// qstr = QString::fromStdString(str);
// //读取图片
// QString images_path = QCoreApplication::applicationDirPath() + "\\src\\images\\keji.jpeg";
// String images_path_S = images_path.toStdString();
// Mat image=cv::imread(images_path_S,1);
// Mat image=cv::imread("E:\\My_Files\\Practice_Projects\\Qt\\Practice\\Qt_Opencv_Model\\src\\imges\\keji.jpeg",1);//一定要使用绝对路径,其他可以回报错
// cv::namedWindow( "Display window", WINDOW_AUTOSIZE );
// cv::imshow( "Display window", image );
// 1、程序所在路径
// qDebug()<<QCoreApplication::applicationDirPath();
// 2、程序的完整名称
// qDebug()<<QCoreApplication::applicationFilePath();
// 3、Qt的qrc里面资源的路径
// qDebug()<<"../src/images";
QString page_1 = QCoreApplication::applicationDirPath() + "/src/images/keji.jpg";
QString page_2 = QCoreApplication::applicationDirPath() + "/src/images/keji.jpg";
Mat srcImage_1 = imread(page_1.toLatin1().data(), 1); // 读取图片数据
Mat srcImage_2 = imread(page_2.toLatin1().data(), 1);
cvtColor(srcImage_1, srcImage_1, COLOR_BGR2RGB); // 图像格式转换
cvtColor(srcImage_2, srcImage_2, COLOR_BGR2RGB);
QImage disImage_1 = QImage((const unsigned char*)(srcImage_1.data), srcImage_1.cols, srcImage_1.rows,srcImage_1.step, QImage::Format_RGB888);
QImage disImage_2 = QImage((const unsigned char*)(srcImage_2.data), srcImage_2.cols, srcImage_2.rows,srcImage_2.step, QImage::Format_RGB888);
ui->label->setPixmap(QPixmap::fromImage(disImage_1.scaled(ui->label->size(), Qt::KeepAspectRatio))); // label 显示图像
QGraphicsScene *scene = new QGraphicsScene; // graphicsView 显示图像
scene->addPixmap(QPixmap::fromImage(disImage_2));
ui->graphicsView->setScene(scene);
ui->graphicsView->show();
}
MainWindow::~MainWindow()
{
delete ui;
}