OpenCV/C++で画像処理入門 vol.1 〜画像を表示してみよう〜
2018.12.21
こんにちは、代表の大野です。
今日からシリーズもので、
画像処理開発の入門編について
書いていきたいと思います。
コンピュータを使ったデジタル画像処理の分野は、
古くはNASAが月面写真の処理をしたり、
医用診断などで、X線画像の処理あたりからはじまったようですが、
昨今では、PCのスペックが、グンと上がったり、
画像処理を便利にできるライブラリなどが出始めたことにより
いまでは、様々な分野で応用されるようになってきました。
特に、画像処理開発に拍車をかけたのが
オープンソースライブラリであるOpenCVであることは
間違いないでしょう。
本来は、
「画像処理の仕組み」
から書くのがよさそうですが
ここにたどり着いていただいた
読者のみなさんは
手っ取り早く、
プログラムを書いて動かしてみたい!
と思うだろうと思って、
以後、入門編ということもあり
簡単な画像処理の方法を
プログラムを交えてご紹介していくことにします。
やること
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. 画像を加工してみよう
↓↓↓ぜひチェックしてください
~提供中のヒューマンセンシング技術~
◆人物検出技術
歩行者・来店者数計測やロボット搭載も
https://humandetect.pas-ta.io
◆視線検出技術
アイトラッキングや次世代UIに
https://eyetrack.pas-ta.io
◆生体判定技術
eKYC・顔認証のなりすまし対策を!
https://bio-check.pas-ta.io
◆目検出技術
あらゆる目周りデータを高精度に取得
https://pupil.pas-ta.io
◆音声感情認識技術
会話から怒りや喜びの感情を判定
https://feeling.pas-ta.io
◆虹彩認証技術
目の虹彩を利用した生体認証技術
https://iris.pas-ta.io