您的位置:首页 > 文旅 > 美景 > opencv中文路径问题

opencv中文路径问题

2024/10/5 3:25:15 来源:https://blog.csdn.net/maokexu123/article/details/139771259  浏览:    关键词:opencv中文路径问题

目的

在windows系统上,就是直接用QT的utf8编码作为图片路径用在opencv读取或者写入函数,在路径当中含有中文时,会提示编码错误。
就是解决opencv中的中文路径的问题。

情况

代码如下:

#pragma execution_character_set("utf-8")
#include <QApplication>
#include <QDebug>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char *argv[])
{QApplication a(argc, argv);//MainWindow w;//w.show();//QString str = QString::fromUtf8("E:\\temp\\lushanjing3.jpg");QString str = QString::fromUtf8("E:\\temp\\图片\\lushanjing2.jpg");qDebug()<<str;Mat img = imread(str.toStdString());//图片路径//处理前imshow("img",img);//显示图片//Mat resimg;//高斯模糊//cv::GaussianBlur(img,resimg,Size(5,5),0);//imshow("resimg",resimg);//显示图片waitKey(2000);//等待按键return a.exec();
}

运行情况:

17:21:01: Starting E:\project2023\example\openCv1\build-openCv1-Desktop_Qt_5_11_3_MSVC2015_64bit-Release\release\openCv1...
"E:\\temp\\图片\\lushanjing2.jpg"
[ WARN:0@0.071] global E:\openSource\opencv4.5\opencv-4.5.5\modules\imgcodecs\src\loadsave.cpp (239) cv::findDecoder imread_('E:\temp\鍥剧墖\lushanjing2.jpg'): can't open/read file: check file path/integrity
1127, FromFilemap
OpenCV: terminate handler is called! The last OpenCV error is:
OpenCV(4.5.5) Error: Assertion failed (!_src.empty()) in cv::cvtColor, file E:\openSource\opencv4.5\opencv-4.5.5\modules\imgproc\src\color.cpp, line 182
17:21:02: 程序异常结束。
17:21:02: The process was ended forcefully.

这个问题就是中文路径的问题。
如何解决呢?
在Qt中使用OpenCV打开含有中文路径的图片时,可能会遇到编码问题。这是因为Qt默认使用的是UTF-8编码,而Windows系统中路径字符串通常使用的是GBK或其他编码。
为了解决这个问题,可以在打开文件前将中文路径转换为OpenCV可以理解的编码格式。
代码更改如下:

//#include "mainwindow.h"
#pragma execution_character_set("utf-8")
#include <QApplication>
#include <QDebug>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char *argv[])
{QApplication a(argc, argv);//MainWindow w;//w.show();//QString str = QString::fromUtf8("E:\\temp\\lushanjing3.jpg");QString str = QString::fromUtf8("E:\\temp\\图片\\lushanjing2.jpg");//QString str = QString::fromLocal8Bit("E:\\temp\\图片\\lushanjing2.jpg");qDebug()<<str;Mat img = imread(str.toLocal8Bit().toStdString());//图片路径//处理前imshow("img",img);//显示图片//Mat resimg;//高斯模糊//cv::GaussianBlur(img,resimg,Size(5,5),0);//imshow("resimg",resimg);//显示图片waitKey(2000);//等待按键return a.exec();
}

运行情况如下:
在这里插入图片描述

显然是可以成功运行的。

总结

其关键在于用了toLocal8Bit()的编码转化,这一个函数的解释如下:
以QByteArray形式返回字符串的本地8位表示形式。如果字符串包含本地8位编码不支持的字符,则返回的字节数组是未定义的。
简单来说就是,以转化为以本地编码的字符串,显然适应了当前的要求:
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com