- 追加された行はこの色です。
- 削除された行はこの色です。
- 画像の読み込み へ行く。
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とリンクしないと,ロードに失敗する模様.¬e{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閲覧};¬e{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]]準拠