はじめに
私の所属するチームにおいて、OpenCVでは日本語が読めないのでは?という話題が上がりました。ネットを調べていても、OpenCVでは日本語(マルチバイト文字)を読めないという記事がいくつかヒットします。
百聞は一見に如かずということで、私のWindows環境でも試してみました。
参考記事
結論
- C++のOpenCVで、日本語パスの画像を問題なく読み書きすることができました。(※ 私のWindows環境では)
- ファイルパスをstd::stringで指定すれば問題なさそう
下記に、検証コードと検証結果を貼り付けます。
検証環境
- OS: Windows 11 Home (22H2)
- CPU: 11th Gen Intel(R) Core(TM) i7-11390H @ 3.40GHz 2.92 GHz
- Visual Studio: 2022 (v143)
- Windows SDK: 10.0
- C++言語標準 ISO C++ 20
- OpenCV: https://opencv.org/releases/
- Lib: opencv_world4100.lib
- Dll: opencv_world4100.dll
検証方法
- 下記のように日本語文字および空白文字が含まれる画像パスになるよう、画像を配置します
- サンプルコードを用意します
- cv::imread()
- cv::imshow()
- cv::imwrite()
- サンプルコードを実行し、画像を問題なく読み書きできることを検証します
サンプルコード
#include <iostream>
#include "opencv2/opencv.hpp"
#include <string>
#include <array>
int main()
{
// 画像ファイルのパス
std::array<std::string, 2> fileStrings = {
R"(C:\テストデータ\日本語 空 白あり\sample.jpg)",
R"(C:\テストデータ\日本語 空 白あり\サンプル - コピー@!#.jpg)"
};
std::for_each(fileStrings.begin(), fileStrings.end(), [](std::string fileString) {
try {
// 画像ファイルを読み込む
cv::Mat image = cv::imread(fileString);
//エラー処理
if (image.empty() == true) {
std::cout << "読み込みに失敗しました" << std::endl;
return -1;
}
// ウィンドウに画像を表示する
cv::imshow(fileString, image);
// キーが押されるまで待つ
cv::waitKey(0);
// 画像を書き出し
const int ret = cv::imwrite(fileString + "の出力結果.png", image);
std::cout << "書き込み結果 = " << ret << std::endl;
}
catch (cv::Exception& e) {
std::cerr << e.what() << std::endl;
return -1;
}
});
return 0;
}
出力結果
-
cv::imshow()の出力例
-
コンソール出力結果
-
画像ディレクトリのファイル
まとめ
今回私が実施した環境では、日本語パスの画像も問題なく読むことができました。char, wchar, wstring等は試していませんが、std::stringであれば問題なさそうです。