Windows上的opencv imread()用于非ASCII文件名

Vya*_*lav 11 c++ unicode winapi qt opencv

我们有一个OpenCV问题,即在Windows上打开(和写入)包含非Ascii字符的文件路径.我看到OpenCV imread with foreign charactersimread(openCV),QString unicodes,但仍然不理解解决问题的正确方法.

就像我在OpenCV源代码中看到的那样,它甚至在Windows上使用fopen(而不是_wfopen),并且afaik fopen在Windows上不处理非ascii字符.从上面的问题我看到可能有一些使用QStrings的技巧,但如果它的工作原理是什么呢?它如何将unicode字符串转换为Windows'fopen()接受的字符数组?

PS我们不使用QT

提前致谢!

Rog*_*and 11

在不破解OpenCV源代码的情况下执行此操作的方法是使用_wfopen(如Remy建议的那样)将整个文件读入内存缓冲区.然后使用OpenCV的函数从该缓冲区imdecode创建一个cv::Mat.

如果需要,您也可以反过来 - 即用于imencode将图像写入内存缓冲区,然后用于_wfopen打开具有UNICODE名称的文件并将缓冲区写入其中(或者,您可以只imwrite使用临时文件然后移动/使用适当的API函数重命名它).


小智 5

尝试这个:

cv::Mat ReadImage(const wchar_t* filename)
{
    FILE* fp = _wfopen(filename, L"rb");
    if (!fp)
    {
        return Mat::zeros(1, 1, CV_8U);
    }
    fseek(fp, 0, SEEK_END);
    long sz = ftell(fp);
    char* buf = new char[sz];
    fseek(fp, 0, SEEK_SET);
    long n = fread(buf, 1, sz, fp);
    _InputArray arr(buf, sz);
    Mat img = imdecode(arr, CV_LOAD_IMAGE_COLOR);
    delete[] buf;
    fclose(fp);
    return img;
}
Run Code Online (Sandbox Code Playgroud)