opencv imread() on Windows for non-ASCII file names

c++, imread, opencv, unicode, winapi

Solution

The way to do this without hacking the OpenCV source code is to use `_wfopen` (as Remy suggested) to read the whole file into a memory buffer. Then use OpenCV's function `imdecode` to create a `cv::Mat` from that buffer.

You can do the reverse too, if necessary - i.e. use `imencode` to write an image to a memory buffer, then use `_wfopen` to open a file with a UNICODE name and write the buffer to it (alternatively, you could just `imwrite` to a temporary file and then move/rename it using the appropriate API function).

Problem

We have an OpenCV problem of opening (and writing) file paths that contain non-ASCII characters on Windows. Affected functions are: `cv::imread()`, `cv::imwrite()`, ... As far as I saw in the OpenCV source code, it uses `fopen` even on Windows (instead of `_wfopen`) and AFAIK `fopen` does not handle non-ASCII characters on Windows. I saw questions OpenCV imread with foreign characters and imread(openCV),QString unicodes but still didn't understand a proper way of solving the problem. From the questions above I saw that there could be some trick using `QString`s, but if it works what does it exactly do? How does it transform a unicode string to a character array that will be accepted by Windows' `fopen()`? P.S. We don't use QT

Original source