使用 imread 打开带有 unicode 名称的图像文件

aha*_*555 3 c++ unicode opencv image

我需要读取带有 Unicode 名称的图像文件,但是 openCV 函数 imread 的图像名称参数仅支持字符串。如何将我的 Unicode 路径保存到字符串对象。有什么解决办法吗?

Mik*_*iki 6

你可以:

  1. 打开文件ifstream
  2. 阅读所有内容std::vector<uchar>
  3. 解码它cv::imdecode

请参阅下面的示例,该示例img2使用 Unicode 文件名加载到图像中ifstream

#include <opencv2\opencv.hpp>
#include <vector>
#include <fstream>

using namespace cv;
using namespace std;

int main()
{
    // This doesn't work with Unicode characters

    Mat img = imread("D:\\SO\\img\\æbärn?.jpg");
    if (img.empty()) {
        cout << "Doesn't work with Unicode filenames\n";
    }
    else {
        cout << "Work with Unicode filenames\n";
        imshow("Unicode with imread", img);
    }

    // This WORKS with Unicode characters

    // This is a wide string!!!
    wstring name = L"D:\\SO\\img\\æbärn?.jpg";

    // Open the file with Unicode name
    ifstream f(name, iostream::binary);

    // Get its size
    filebuf* pbuf = f.rdbuf();
    size_t size = pbuf->pubseekoff(0, f.end, f.in);
    pbuf->pubseekpos(0, f.in);

    // Put it in a vector
    vector<uchar> buffer(size);
    pbuf->sgetn((char*)buffer.data(), size);

    // Decode the vector
    Mat img2 = imdecode(buffer, IMREAD_COLOR);

    if (img2.empty()) {
        cout << "Doesn't work with Unicode filenames\n";
    }
    else {
        cout << "Work with Unicode filenames\n";
        imshow("Unicode with fstream", img2);
    }

    waitKey();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果您使用 Qt,您可以使用QFileand更方便地执行此操作QString,因为QString本机处理 Unicode 字符,并QFile提供了一种简单的方法来确定文件大小:

QString name = "path/to/unicode_img";
QFile file(name);
file.open(QFile::ReadOnly);
qint64 sz = file.size();
std::vector<uchar> buf(sz);
file.read((char*)buf.data(), sz);
cv::Mat3b img = cv::imdecode(buf, cv::IMREAD_COLOR);
Run Code Online (Sandbox Code Playgroud)

为了完整起见,您可以在此处查看如何在 Python 中执行此操作