imreadで画像をロード

Mat cv::imread(String &filename, int flags);

  • OpenCV 2.0 から実装されたC++インタフェース
  • OpenCV 3.0 より、 highguiモジュールからimgcodecモジュールに移動した

引数

  • filename:String型のファイル名
  • flags:int型のモード.カラーかグレースケールか.詳しくは下参照.

返り値

  • ロードされたMat型のクラス

解説

  • filenameは絶対パスでも相対パスでも可.
    • JPEG、JPEG2000、BMP、TIFF、PNGなどに対応している
    • ファイル先頭に記載されているバイナリヘッダで判定する
    • インデックスカラー画像も通常の3チャンネルのカラー画像として読み込む.
    • カラー画像は,各画素内で要素がBGRの順で並ぶ
  • color_modeは以下のいずれか.ヘッダファイル内でenumとして定義されているので、直接数値で指定する場合は()内の数字
    • IMREAD_UNCHANGED (-1)
      • 1番安全.8bit画像として読み込む.カラーかグレーかはOpenCVが判断してくれる.
    • IMREAD_GRAYSCALE (0)
      • グレースケール8bit画像として読み込む.カラー画像を読み込んだ場合は自動的にグレースケール化してくれる.
    • IMREAD_COLOR (1) (デフォルト)
      • 各画素のbit数は未指定.ただし3チャンネル(順序はBGR)で読み込んでくれる.省略した場合はこれを指定した場合に等しい
    • IMREAD_ANYDEPTH (2)
      • 各画素のbit数は自動判別.画素のチャンネル数は未指定.
    • IMREAD_ANYCOLOR (4)
      • 各画素のbit数は未指定.画像のチャンネル数は自動で判断してくれる.
    • IMREAD_REDUCED_GRAYSCALE_2 (16)
    • IMREAD_REDUCED_COLOR_2 (17)
    • IMREAD_REDUCED_GRAYSCALE_4 (32)
    • IMREAD_REDUCED_COLOR_4 (33)
    • IMREAD_REDUCED_GRAYSCALE_8 (64)
    • IMREAD_REDUCED_COLOR_8 (65)
      • 上記6つは画像を読み込んだ上で1/2、1/4、1/8のサイズにそれぞれ縮小して読み込む (only OpenCV 3.1 and later)
    • 以下のオプションはGDALライブラリが必要
    • IMREAD_LOAD_GDAL (8)
      • GDALドライバを使ってロード (only OpenCV 3.0 and later)
  • Debug ModeではDebug ModeのLibrary,Release ModeではRelease ModeのLibraryとリンクしないと,ロードに失敗する模様.*1*2

サンプルコード

自動で読み込む場合

using namespace cv;
Mat input;
input = imread("./test.bmp", IMREAD_UNCHANGED );
//インデックスカラー形式のBMPは3チャンネルの画像に変換される

明示的にグレーにする場合

using namespace cv;
Mat input;
input = imread("./test.bmp", IMREAD_GRAYSCALE );
//これでカラー画像を読み込むと,グレースケール化される

明示的にカラーで読み込む場合

using namespace cv;
Mat input;
input = imread("./test.bmp", IMREAD_COLOR );
//これでグレースケール画像を読み込むと,RGBに同じ値が入った冗長な配列ができる.

その他

  • どうもflags引数はbit演算のようで,下記のように足し算で使うようだ.
    cv::imread("./test.bmp", IMREAD_COLOR+IMREAD_ANYDEPTH );
  • IMREAD_LOAD_GDALを指定しても、GDALライブラリがなければ、通常の自動モード/カラーモードにスイッチするだけ。

グレースケールとカラー画像をそれぞれのオプションで読み込んだ場合

#include <opencv2/imgcodecs.hpp>
#include <opencv2/core.hpp>
#include <iostream>
const char filename_lena[] = "file/path/to/color/image"; // 512x512 px 3 channels
const char filename_gray[] = "file/path/to/gray/image";  // 512x512 px 1 channel
const char optionNameDefault[] = "default         ";
const int options[] = {
	cv::IMREAD_UNCHANGED,
	cv::IMREAD_GRAYSCALE,
	cv::IMREAD_COLOR,
	cv::IMREAD_ANYDEPTH,
	cv::IMREAD_ANYCOLOR,
};
const char *optionNames[] = {
	"IMREAD_UNCHANGED",
	"IMREAD_GRAYSCALE",
	"IMREAD_COLOR    ",
	"IMREAD_ANYDEPTH ",
	"IMREAD_ANYCOLOR ",
	'\0',
};
const char *typeNames[] = {
	"CV_8U ",
	"CV_8S ",
	"CV_16U",
	"CV_16S",
	"CV_32S",
	"CV_32F",
	"CV_64F",
};

void dumpImageFormatInformation(cv::Mat& image, const char* option)
{
	std::cout << "== option " << option     << " == ";
	std::cout << "width:"     << image.cols << ' ';
	std::cout << "height:"    << image.rows << ' ';
	std::cout << "steps:"     << image.step << '\t';
	std::cout << "channel:"   << CV_MAT_CN(image.flags) << ' ';
	std::cout << "type:"      << typeNames[CV_MAT_DEPTH(image.flags)] << '(' << CV_MAT_DEPTH(image.flags) << ')' << std::endl;
}

int main()
{
	using namespace cv;
	std::cout << "== Color image ==" << std::endl;

	Mat inputLena;
	inputLena = imread(filename_lena);
	dumpImageFormatInformation(inputLena, optionNameDefault);

	int index = 0;
	while(optionNames[index] != '\0')
	{
		inputLena = imread(filename_lena, options[index]);
		dumpImageFormatInformation(inputLena, optionNames[index]);
		index++;
	}

	std::cout << std::endl;
	std::cout << "== Gray image ==" << std::endl;
	Mat inputGray;
	inputGray = imread(filename_gray);
	dumpImageFormatInformation(inputGray, optionNameDefault);

	index = 0;
	while(optionNames[index] != '\0')
	{
		inputGray = imread(filename_gray, options[index]);
		dumpImageFormatInformation(inputGray, optionNames[index]);
		index++;
	}
}
  • 実行結果
    == Color image ==
    == option default          == width:512 height:512 steps:1536	channel:3 type:CV_8U (0)
    == option IMREAD_UNCHANGED == width:512 height:512 steps:1536	channel:3 type:CV_8U (0)
    == option IMREAD_GRAYSCALE == width:512 height:512 steps:512	channel:1 type:CV_8U (0)
    == option IMREAD_COLOR     == width:512 height:512 steps:1536	channel:3 type:CV_8U (0)
    == option IMREAD_ANYDEPTH  == width:512 height:512 steps:512	channel:1 type:CV_8U (0)
    == option IMREAD_ANYCOLOR  == width:512 height:512 steps:1536	channel:3 type:CV_8U (0)
    
    == Gray image ==
    == option default          == width:512 height:512 steps:1536	channel:3 type:CV_8U (0)
    == option IMREAD_UNCHANGED == width:512 height:512 steps:512	channel:1 type:CV_8U (0)
    == option IMREAD_GRAYSCALE == width:512 height:512 steps:512	channel:1 type:CV_8U (0)
    == option IMREAD_COLOR     == width:512 height:512 steps:1536	channel:3 type:CV_8U (0)
    == option IMREAD_ANYDEPTH  == width:512 height:512 steps:512	channel:1 type:CV_8U (0)
    == option IMREAD_ANYCOLOR  == width:512 height:512 steps:512	channel:1 type:CV_8U (0)
  • IMREAD_COLOR と defaultの挙動は常に同じ
  • IMREAD_UNCHANGED と IMREAD_ANYCOLOR の時、読み込む画像によって挙動が変わる

実体ファイル

OpenCV 2.4系列

  • highgui/include/opencv2/highgui/highgui.hpp
  • highgui/src/loadsave.cpp

OpenCV 3.0系列

  • imgcodecs/include/opencv2/imgcodecs.hpp
  • imgcodecs/src/loadsave.cpp

:OpenCV:OpenCV 2.4:OpenCV 3.0:OpenCV 3.1準拠


*1  visual studio 2008 - Issue with reading an image using "cv::imread" function in OpenCv - Stack Overflow, 2010-04-06投稿, 2010-04-07修正, 2016-01-03閲覧
*2  c++ - OpenCV imread(filename) fails in debug mode when using release libraries - Stack Overflow, 2012-02-03投稿, 2014-12-19修正, 2016-01-03閲覧

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-01-05 (火) 12:56:49 (689d)