QT5.9和VS2019图片读取失败的解决方案
最近入C++/OpenCV的坑了,MATLAB找工作太难了。。MATLAB—GUI用习惯了,也就顺便学习了一下Qt.
这是简单写的一个界面,图像读取的时候出了太多问题。
头文件有这些
#pragma once
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QApplication>
#include "ui_QtGuiApplication1.h"
#include <iostream>
#include <QApplication>
#include <QFileDialog>
#include <QDebug>
#include <QString>
#include <QGraphicsEllipseItem>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <opencv2/opencv.hpp>
#include <algorithm>
#include <iostream>
1.opencv的图片格式和qt的图片格式转换问题
我是采用opencv读取的图片,显示需要转成Qt的QPixmap或者QImage形式
这个是 cvMat转化为QImage的函数,主要是对CV_8UC1,CV_8UC3,CV_8UC4四种格式进行转化。
QImage cvMat2QImage(const cv::Mat& mat)
{ // 8-bits unsigned, NO. OF CHANNELS = 1
// 8-bits unsigned, NO. OF CHANNELS = 1
if (mat.type() == CV_8UC1)
{
QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
// Set the color table (used to translate colour indexes to qRgb values)
image.setColorCount(256);
for (int i = 0; i < 256; i++)
{
image.setColor(i, qRgb(i, i, i));
}
// Copy input Mat
uchar* pSrc = mat.data;
for (int row = 0; row < mat.rows; row++)
{
uchar* pDest = image.scanLine(row);
memcpy(pDest, pSrc, mat.cols);
pSrc += mat.step;
}
return image;
}
// 8-bits unsigned, NO. OF CHANNELS = 3
else if (mat.type() == CV_8UC3)
{
// Copy input Mat
const uchar* pSrc = (const uchar*)mat.data;
// Create QImage with same dimensions as input Mat
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
return image.rgbSwapped();
}
else if (mat.type() == CV_8UC4)
{
qDebug() << "CV_8UC4";
// Copy input Mat
const uchar* pSrc = (const uchar*)mat.data;
// Create QImage with same dimensions as input Mat
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);
return image.copy();
}
else
{
qDebug() << "ERROR: Mat could not be converted to QImage.";
return QImage();
}
}
使用的时候,opencv读取的src,这样就可以转化为Qt的类型了
QImage kk = cvMat2QImage(src);
QPixmap kk3 = QPixmap::fromImage(kk);
2.读取地址错误的的问题
我是采用 opencv的imread函数读取的图片,从qt的textBrowser读取的值。
首先要把读取的Qstring转化为opencv的string格式
QString textstring = ui.textBrowser_2->toPlainText();;
string s2 = textstring.toStdString();
通过这一步可以将Qstring转化为string
然后将斜杠替换("/", “\”);
这里是第一个坑
使用自带的函数
PathName.replace("/", "\\");
这样无法换,需要四个斜杠才行,原因不清楚
PathName.replace("/", "\\\\");
这样才能将"/",替换为"\";
下一个坑就是天坑了,明明路径都是正确的,有些图片读不出来,有些能读出来,后来我打断点发现是系统bug,读取有时候在路径前面会有一个问号,但是在QT的界面却不会显示
在这个C前面有时会有问号,替换掉就行
PathName.replace("?", "");
然后是QT的中英文转换问题,从修正路径textBrowser_2读取带有中文的路径时,会出现乱码,使用XXXXXXX.toLocal8Bit();这个函数修正中文的错误,避免出现乱码
QString textstring = ui.textBrowser_2->toPlainText();;
string s2 = textstring.toStdString();
QByteArray mm = textstring.toLocal8Bit();//中文修复
string str = string(mm);
Mat src = imread(str);
然后就可以使用一些Opencv算法之类的去处理啦,终于好了!这个是个分水岭算法
(好久没有回来写CSDN的博客了,一天天这么混下去什么记忆都没有,还是回来好好写吧,以后看着还能想起来。)
PS:想念我小于师妹。