思路就是将中文路径转成系统编码格式,关键代码如下:
void ShowCVImg::showImage()
{
//选择文件;
QString filePath = QFileDialog::getOpenFileName(this,"选择",QDir::currentPath(),"image file (*jpg *png *tiff)");
if(filePath.isEmpty()) {qDebug()<<"失败";return;}
/*
flag :以任意颜色格式读取,以任意深度读取,原图读取,GDAL加载,
参数1文件路径,
参数2flag,
返回类型 cv::Mat
*/
//创建文件信息类
QFileInfo fileInfo(filePath);
//创建系统编码格式的编码器
QStringEncoder encoder = QStringEncoder(QStringConverter::Encoding::System);
QByteArray byteFilePath = encoder(filePath);
std::string stdFilePath = byteFilePath.toStdString();
qDebug()<<"utf8 filePath:"<<byteFilePath;
QByteArray byteFileName = encoder(fileInfo.fileName());
std::string fileName = byteFileName.toStdString();
img = cv::imread(stdFilePath,cv::IMREAD_ANYCOLOR|cv::IMREAD_ANYDEPTH|cv::IMREAD_UNCHANGED|cv::IMREAD_LOAD_GDAL);
//建立一个窗口,正常大小,图像保持比率,有工具栏,状态栏的窗口
cv::namedWindow(fileName,cv::WINDOW_NORMAL|cv::WINDOW_KEEPRATIO|cv::WINDOW_GUI_EXPANDED);
//显示图像,参数1窗口名字,参数2图像cv::Mat类型
cv::imshow(fileName,img);
}
完整代码如下:
main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QLocale>
#include <QTranslator>
#include <opencv2/opencv.hpp>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator translator;
const QStringList uiLanguages = QLocale::system().uiLanguages();
for (const QString &locale : uiLanguages) {
const QString baseName = "QTCVProject_" + QLocale(locale).name();
if (translator.load(":/i18n/" + baseName)) {
a.installTranslator(&translator);
break;
}
}
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "showcvimg.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//创建ShowCVImg对象,并将该对象设置到窗口正中心
ShowCVImg* imgWidget = new ShowCVImg(this);
this->setCentralWidget(imgWidget);
}
MainWindow::~MainWindow()
{
}
showcvimg.h
#include "showcvimg.h"
ShowCVImg::ShowCVImg(QWidget *parent)
: QWidget{parent}
{
//创建三个按钮实例对象
QPushButton* btn1 = new QPushButton("显示",this);
QPushButton* btn2 = new QPushButton("关闭",this);
QPushButton* btn3 = new QPushButton("保存",this);
//创建一个水平布局对象,并将对象添加到水平布局
QHBoxLayout* hl = new QHBoxLayout(this);
hl->addWidget(btn1);
hl->addWidget(btn2);
hl->addWidget(btn3);
this->setLayout(hl);
//连接信号与槽的连接,换句话说就是点击触发后该执行怎么动作
connect(btn1,&QPushButton::clicked,this,&ShowCVImg::showImage);
connect(btn2,&QPushButton::clicked,this,[](){cv::destroyAllWindows();});
connect(btn3,&QPushButton::clicked,this,&ShowCVImg::writeImage);
}
void ShowCVImg::writeImage()
{
/*
保存图像
*/
//选择保存路径
QString filePath = QFileDialog::getSaveFileName(this,"选择",QDir::currentPath(),"image file (*jpg *png *tiff)");
//判断路径是否为空
if(filePath.isEmpty()) {qDebug()<<"失败";return;}
//写入图像,参数1文件路径,参数2img
cv::imwrite(filePath.toStdString(),img);
}
void ShowCVImg::showImage()
{
//选择文件;
QString filePath = QFileDialog::getOpenFileName(this,"选择",QDir::currentPath(),"image file (*jpg *png *tiff)");
if(filePath.isEmpty()) {qDebug()<<"失败";return;}
/*
flag :以任意颜色格式读取,以任意深度读取,原图读取,GDAL加载,
参数1文件路径,
参数2flag,
返回类型 cv::Mat
*/
//创建文件信息类
QFileInfo fileInfo(filePath);
//创建系统编码格式的编码器
QStringEncoder encoder = QStringEncoder(QStringConverter::Encoding::System);
//生成系统编码格式的文件路径;
QByteArray byteFilePath = encoder(filePath);
//转成std::string类型
std::string stdFilePath = byteFilePath.toStdString();
qDebug()<<"utf8 filePath:"<<byteFilePath;
//生成系统编码格式的文件名
QByteArray byteFileName = encoder(fileInfo.fileName());
std::string fileName = byteFileName.toStdString();
//读取图像,参数1文件路径
img = cv::imread(stdFilePath,cv::IMREAD_ANYCOLOR|cv::IMREAD_ANYDEPTH|cv::IMREAD_UNCHANGED|cv::IMREAD_LOAD_GDAL);
//建立一个窗口,正常大小,图像保持比率,有工具栏,状态栏的窗口
cv::namedWindow(fileName,cv::WINDOW_NORMAL|cv::WINDOW_KEEPRATIO|cv::WINDOW_GUI_EXPANDED);
//显示图像,参数1窗口名字,参数2图像cv::Mat类型
cv::imshow(fileName,img);
}
效果图如下