imreadで画像をロード

#contents

*Mat cv::imread(String &filename, int flags); [#odb62250]

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

**引数 [#tb5dec21]
-filename:String型のファイル名
-flags:int型のモード.カラーかグレースケールか.詳しくは下参照.

**返り値 [#ed624959]

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

**解説 [#s8986e33]

-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とリンクしないと,ロードに失敗する模様.&note{Issue-Reading-Image-Using-Cv-Imread-Function-OpenCv:[[visual studio 2008 - Issue with reading an image using "cv::imread" function in OpenCv - Stack Overflow>http://efreedom.com/Question/1-2584273/Issue-Reading-Image-Using-Cv-Imread-Function-OpenCv]], 2010-04-06投稿, 2010-04-07修正, 2016-01-03閲覧};&note{opencv-imreadfilename-fails-in-debug-mode-when-using-release-libraries:[[c++ - OpenCV imread(filename) fails in debug mode when using release libraries - Stack Overflow>http://stackoverflow.com/questions/9125817/opencv-imreadfilename-fails-in-debug-mode-when-using-release-libraries]], 2012-02-03投稿, 2014-12-19修正, 2016-01-03閲覧};

*サンプルコード [#ccba9dc2]
**自動で読み込む場合 [#xef2ed44]
#geshi(c++){{
using namespace cv;
Mat input;
input = imread("./test.bmp", IMREAD_UNCHANGED );
//インデックスカラー形式のBMPは3チャンネルの画像に変換される
}}

**明示的にグレーにする場合 [#s9a4c1cd]
#geshi(c++){{
using namespace cv;
Mat input;
input = imread("./test.bmp", IMREAD_GRAYSCALE );
//これでカラー画像を読み込むと,グレースケール化される
}}

**明示的にカラーで読み込む場合 [#qf20a381]
#geshi(c++){{
using namespace cv;
Mat input;
input = imread("./test.bmp", IMREAD_COLOR );
//これでグレースケール画像を読み込むと,RGBに同じ値が入った冗長な配列ができる.
}}

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

**グレースケールとカラー画像をそれぞれのオプションで読み込んだ場合 [#y43b07f6]
#geshi(c++){{
#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 の時、読み込む画像によって挙動が変わる


*実体ファイル [#ida7c56e]
**OpenCV 2.4系列 [#qb0ec3e8]
-highgui/include/opencv2/highgui/highgui.hpp
-highgui/src/loadsave.cpp
**OpenCV 3.0系列 [#dc8e5bb4]
-imgcodecs/include/opencv2/imgcodecs.hpp
-imgcodecs/src/loadsave.cpp

[[:OpenCV]][[:OpenCV 2.4]][[:OpenCV 3.0]][[:OpenCV 3.1]]準拠

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS