1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【C++】あれ、OpenCVのimread/imwriteで日本語パス使えるじゃん?

Last updated at Posted at 2024-08-03

はじめに

私の所属するチームにおいて、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

検証方法

  1. 下記のように日本語文字および空白文字が含まれる画像パスになるよう、画像を配置します
  2. サンプルコードを用意します
    • cv::imread()
    • cv::imshow()
    • cv::imwrite()
  3. サンプルコードを実行し、画像を問題なく読み書きできることを検証します

image.png

サンプルコード

#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()の出力例

    • 読み込んだ画像がWindowに表示されています
      image.png
  • コンソール出力結果

    • 書き込みも正常終了しています
      image.png
  • 画像ディレクトリのファイル

    • 指定したディレクトリに出力結果が.pngで出力されています
      image.png

まとめ

今回私が実施した環境では、日本語パスの画像も問題なく読むことができました。char, wchar, wstring等は試していませんが、std::stringであれば問題なさそうです。

日本語パスの読み込みに失敗する例(この記事の反例)がありましたら、コメント💬いただければ嬉しいです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?