c++ Opencv函数和宽字符串

nwnhqdif  于 2023-04-01  发布在  其他
关注(0)|答案(3)|浏览(206)

cv::imread()这样的Opencv函数只接受strings作为参数。所以,如果我写:

cv::Mat image = cv::imread("C:\\folder\\image.jpg");

一切正常,它将加载图像。但是,如果路径包含宽字符(例如希腊字母):

wstring path = L"C:\\folder\\εικονα.jpg";

我不能只写:

cv::Mat image = cv::imread( path );

我已经试过了(但显然失败了):

cv::Mat image = cv::imread( string(path.begin(), path.end()) );

有什么解决方案吗?或者我只能离开opencv并使用其他东西?

ldfqzlk8

ldfqzlk81#

可以使用std的filestreams和OpenCV的imdecode和imencode向/从wstring路径写入/读取图像。

wstring path = getPath();
    size_t size = getFileSize(path);
    vector<uchar> buffer(size);

    ifstream ifs(path, ios::in | ios::binary);
    ifs.read(reinterpret_cast<char*>(&buffer[0]), size);

    Mat image = imdecode(buffer, flags);
d8tt03nd

d8tt03nd2#

目前的答案是***NO***,正如官方OpenCV repo的Issue #4292中所讨论的那样。
现在使用Boost和内存Map文件的一个可能的解决方法是:

mapped_file map(path(L"filename"), ios::in);
Mat file(1, numeric_cast<int>(map.size()), CV_8S, const_cast<char*>(map.const_data()), CV_AUTOSTEP);
Mat image(imdecode(file, 1));
fjaof16o

fjaof16o3#

使用C++17的std::filesystem作为解决方法

#include <filesystem>
std::filesystem::path path = L"C:\\folder\\εικονα.jpg";
cv::Mat image = cv::imread( path.string() );

相关问题