こんにちは。くらくです。
前回はデジタル画像がどのように表現されるのか書きました↓
eveydayanime-9rakura.hatenablog.com
これを踏まえて、今回は画素読み込みと画像表示について書いていこうと思います。
画像を読み込んで何らかの処理を施して結果を表示する…基本ではありますが、画像処理を行う上で一番扱うことが多くなるものだと思います。
OpenCVの導入いついてはQitaにたくさん記事があるので省くこととします。
もし需要があるようなら書きますのでコメントにて教えていただければありがたいです。
OpenCVが4系になり、引数等に使われる定数が変更されているのですが、
その辺りの記述がまだあまり出回っていないようなので、
(公式のドキュメントを読めばわかるのであまり必要ないかもですが……)
今後その辺りについては書いていくかもしれないです。
また、備忘録としての意味も含め、Pythonでも記述とC++での記述どちらも書いていこうと思います。
(まずC++の記述をし、Pythonでの記述は追記していくと言う感じにします…)
参考として用いている公式ドキュメント↓
https://docs.opencv.org/4.0.0/
画像の読み込み
Mat型の宣言
前回も書きましたが、画像はプログラム上ではOpenCVに用意されている行列を管理する構造体、Matクラスを用いて扱います。
宣言は、
C++
cv::Mat 変数名;
とします。
公式ドキュメントを見ると相当長く色々複雑なので、
画像の高さ(rows)と幅(cols)、チャンネル数を保有しているということだけ知っていれば良いです。
(つまりメンバ関数によってその値を得られますし、宣言時に指定もできます)
C++を知らないを人にとっては、まずcv::って何?と思うかもしれませんが、
これは名前空間を表します。単純にこれはOpenCVのクラスや関数だよと表すものです。標準C++ライブラリの場合はstd::とついたりします。
これが煩わしいと感じる人はmain文外に
using namespace std;
using namespace cv;
と記述しておくといちいち書かなくても良いです。
(ただし複数人で扱うプログラムに関しては、名前空間は記述するのがベターです)
画像の読み込み
画像の読み込みはcv::imread関数を使います。引数として読み込む画像ファイルパスを渡します。
格納する変数をsrc_img、読み込む画像ファイルパスをFILENAMEとすると、
C++
cv::Mat src_img = cv::imread(FILENAME);
とします。
画像読み込みが正しく行えているか確かめるため、
if( src_img.empty() ){
return (-1);
}
と言う記述をし、チェックを行うようにしておくと良いです。
画像の表示
ウィンドウ
画像を表示するためにはその画像を収めるウィンドウが必要です。
写真を飾るための額縁のようなものと思ってもらえれば良いです。
以前は、先にウィンドウを宣言し、画像を表示する必要がありましたが、現在必要なくなりました。
とりあえずそう言うものがあると言うことだけ覚えておいてもらえれば良いです。
今はマクロでウィンドウの名前だけを宣言しておいて、表示するときに使うと言うのが主流だと思います。
画像の表示
画像の表示はcv::imshow関数を使います。第一引数としてウィンドウ名、第二引数として表示する画像の変数を渡します。
ウィンドウ名をWINDOW_INPUT、表示する画像の変数をsrc_imgとすると、
C++
cv::imshow(WINDOW_INPUT, src_img);
とします。
キー入力待ち
画像を表示させたいとき、待ち状態にしないとただプログラムを走らせて終わり、となってしまい結果を見ることができません。
ここでcv::WaitKey関数を用います。
C++
cv::WaitKey();
これを画像表示の後に記述しておくことでウィンドウに描画された画像が表示されていることを確認できます。
ウィンドウを読み込むたびにcv::WaitKey();を記述し読み込む必要があります。
ソースプログラム
全体の流れを踏まえたソースプログラムを記載しておきます。
c++
#include <iostream>
#include <opencv2/opencv.hpp>
//画像ファイル
#define FILE_NAME "ファイルパスを入れる"
#define WINDOW_NAME_INPUT "input"
#define WINDOW_NAME_OUTPUT "output"
int main(int argc, const char * argv[]) {
int x, y;
//画像の入力
cv::Mat src_img = cv::imread(FILE_NAME);
if (src_img.empty()) { //入力失敗の場合
return (-1);
}
cv::imshow(WINDOW_NAME_INPUT, src_img);//画像の表示
cv::waitKey(); //キー入力待ち (止める)
return 0;
}
おわりに
薄い内容となってしまいましたが、今回はここまでとします。
簡単な内容となってしまいましたが、画像処理を行う際に毎回使うのでしっかり覚えておく必要があります。
一連の流れを含めたプログラムを環境構築をした自身のエディタで試してもらうと理解が深まると思います。
次回は画素操作とグレースケール化について書きたいと思います。
最後まで目を通してくださりありがとございました。
次からはMarkdownで書いてソースを見やすくしたいですね…。