OpenCV/C++で画像処理入門 vol.1 〜画像を表示してみよう〜

2018.12.21

 

こんにちは、代表の大野です。

 

今日からシリーズもので、
画像処理開発の入門編について
書いていきたいと思います。

 

コンピュータを使ったデジタル画像処理の分野は、
古くはNASAが月面写真の処理をしたり、
医用診断などで、X線画像の処理あたりからはじまったようですが、

 

昨今では、PCのスペックが、グンと上がったり、
画像処理を便利にできるライブラリなどが出始めたことにより

 

いまでは、様々な分野で応用されるようになってきました。

 

特に、画像処理開発に拍車をかけたのが
オープンソースライブラリであるOpenCVであることは
間違いないでしょう。

 

引用:https://opencv.org/

 

 

本来は、

 

「画像処理の仕組み」

 

から書くのがよさそうですが

 

ここにたどり着いていただいた
読者のみなさんは

 

手っ取り早く、
プログラムを書いて動かしてみたい!

 

と思うだろうと思って、

 

以後、入門編ということもあり
簡単な画像処理の方法を
プログラムを交えてご紹介していくことにします。

 

 

やること

OpenCV/C++を使って画像を表示する

 

 

環境

マシン  :mac OS Mojave 10.14.1
言語   :C++
ライブラリ:OpenCV 3.4.3
コンパイラ:Clang / LLVM 

 

 

準備

OpenCVを導入しておきましょう。

 

brewで入れておくと便利です。
パスがおかしくなるとあれなのでpkg-configも入れておきます。

 

環境が異なる方は、各自ぐぐるなどして、
うまくOpenCVが動くような環境を用意しておいてください。

 

ターミナルとか

1
2
brew install pkg-config
brew install opencv

 

brewなんてないよ、と言われる人は
ちゃんと最初にHomebrewをインストールしておきましょう。
https://brew.sh/index_ja.html

 

 

画像を用意する

では、OpenCVが使えるようになったところで、
次に、処理を行う対象となる、
サンプルの画像を用意しましょう。

 

いんきゅべーと秘書 スワワちゃん(suwawachan.jpg)

 

 

今回使用するのは、
うちの会社マスコットキャラクターである
スワワちゃんさんです。

 

 

画像を表示してみよう

さて、準備が整ったところで、
早速C++言語を用いて、
OpenCVライブラリによる画像操作を行なっていきます。

 

今日は、初歩中の初歩である、
cv::imshow()を使った画像表示です。

 

<ソースプログラム>

imshow.cpp

1
2
3
4
5
6
7
8
9
10
11
12
#include <opencv2/opencv.hpp>

int main() {
 cv::Mat img;

 img = cv::imread("suwawachan.jpg");

 cv::imshow("title", img);
 cv::waitKey(0);

 return 0;
}

 

インクルードするのは、
OpenCVの「opencv.hpp」だけ。

 

とりあえずこれをインクルードしておけば
そのファイルの中で、

いろいろ必要なものを
さらにインクルードしてくれているので安心です。

 

main関数内では
まずはじめに、cv::Mat型のimgという名前の変数を
ここでは宣言することにします。

 

1
 cv::Mat img;

 

Matというのは、「Matrix」の略なので、
いわゆる「行列」のことです。

 

理系の大学では、1年生あたりで
線形代数の授業でやったのではないでしょうか。

 

ちょっと前まで高校数学で
行列の単元があったようなのですが
いまでは消滅した模様。

 

さて、OpenCVの世界では、このcv::Mat型が
画像ファイルを格納するものとイメージしてもらえればよいかと思います。

 

デジタルの画像ファイルを、cv::Mat型に入れると、
画素値の行列として格納されることになります。

 

続いて、
画像ファイルを操作するために、

 

cv::imread()関数を使って、
先ほど宣言した
cv::Mat型であるimgへ代入します。

 

1
 img = cv::imread("suwawachan.jpg");

 

cv::imread()関数では、
引数にファイル名を指定してください。
(別の階層に画像ファイルがあるなら、cv::imread(“../img/suwawachan.jpg”)のような感じ )

 

さて、本題の画像の表示は、
ソースプログラム内の、cv::imshow()関数になります。

 

第一引数に、表示ウィンドウのタイトルバーに表示される文字、
第二引数に表示させたい、cv::Mat型を指定します。

 

1
 cv::imshow("title", img);

 

↑ここでは、表示ウィンドウのタイトルは「title」、
読み込むのは、先ほど画像を読み込んだimgです。

 

最後にcv::imread()とセットで使用される

 

1
 cv::waitKey(0);

 

ですが、

 

cv::imshow()で表示された
ウィンドウの表示制御
をするものだと思ってください。

 

引数に0をとっていると、
キーの入力(Enterキー)が押されるまで
ウィンドウをずっと表示しつづけます。

 

0でない場合
引数としてとるのは、ミリ秒として扱われるので

 

1秒間表示させたい場合は、

 

1
 cv::waitKey(1000);

 

0.1秒間表示させたい場合は、

 

1
 cv::waitKey(100);

 

と書きましょう。

 

すると、ウィンドウが表示されてから
指定した時間後に
自動でウィンドウが閉じるようになります。

 

 

<ビルド & 実行>

エディタで先ほどのソースファイルを書いて、
ファイルに保存したところで

 

ターミナルから、ビルドをして実行してみましょう。

 

ターミナル

1
2
 $ c++ $(pkg-config --cflags --libs opencv) imshow.cpp
 $ ./a.out

 

 

<表示>

 

こんなウィンドウが立ち上がったでしょうか?

 

タイトルバーにもちゃんと
「title」と表示されていますね。

 

cv::waitKey(0)にしていた場合は、
表示されているウィンドウ上で、
Enterキーを押せばウィンドウが閉じるはずです。

 

cv::waitKey(1000)にしていた場合は、
1秒後にウィンドウが閉じることを確認してみてください。

 

ということで、
無事に画像を表示することができました。

 

今回は、超入門で簡単すぎたかもしれませんが
なんだかOpenCVが
はじまったという感じですね。

 

今日はここまで。

 

次回以降もお楽しみに。

 

 

OpenCV/C++で画像処理入門シリーズ

vol1. 画像を表示してみよう
vol2. 画像を加工してみよう

vol3. 画像に図形を描画してみよう

vol4. 画像に文字を書き込んでみよう

vol5. 画像を行列にしてみよう①

 


Top