第6回 初めてのOpenCV開発 ― highgui/imgcodecs/videoioモジュール【OpenCV 3.1.0】:OpenCV入門【3.0対応】(1/2 ページ)
OpenCVのhighgui、imgcodecs、videoioという3つのモジュールの概要を解説。GUI機能、画像ファイル/動画ファイルの入出力機能、カメラキャプチャ機能などのAPIと、その基本的な使い方を説明する。
ご注意:本記事は、@IT/Deep Insider編集部(デジタルアドバンテージ社)が「www.buildinsider.net」というサイトから、内容を改変することなく、そのまま「@IT」へと転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。
1. はじめに
前回、OpenCVのcoreモジュールについて解説を行いました。今回はOpenCVのhighgui/imgcodecs/videoioモジュールについて順に解説します。
また、今回筆者が動作確認した環境は以下の通りです。
項目 | 内容 |
---|---|
OpenCVバージョン | OpenCV 3.1.0 |
Visual Studio | Visual Studio 2013 Update 5 |
ビルド構成 | x64Release |
OS | Windows 10 Pro(64bit) |
筆者が確認した環境 |
1.1 highguiモジュールとは
OpenCVのhighguiモジュールは、Windows/Linux/macOS(Mac)といったプラットフォームの違いを吸収した、GUI機能を提供しています。以下の表に、highguiモジュールが提供する機能で内部的に使われるフレームワーク、OSS(オープンソース・ソフトウェア)をまとめました。
機能 | 内部的に使われるフレームワーク、OSS |
---|---|
GUI機能 | Win32 API(Windowsのみ)、Cocoa(macOSのみ)、GTK+、Qt |
※内部的に使われるフレームワーク、OSSは、プラットフォームやOpenCVのビルド設定によって異なります。
また、CMakeのビルド設定で「ウィンドウ描画のバックエンドとしてQtを利用する」ようにした場合、独自の拡張機能が使えるようになりますが、その内容については今後の連載の中で紹介することとします。
1.2 imgcodecsモジュールとは
OpenCVのimgcodecsモジュールは、Windows/Linux/macOSといったプラットフォームの違いを吸収した画像ファイルの入出力機能を提供しています。OpenCVがサポートしている画像フォーマットについては後述します。
1.3 videoioモジュールとは
OpenCVのvideoioモジュールは、Windows/Linux/macOSといったプラットフォームの違いを吸収した、動画ファイルの入出力機能、カメラキャプチャ機能を提供しています。以下の表に、videoioモジュールが提供する機能で内部的に使われるフレームワーク、OSS(オープンソース・ソフトウェア)をまとめました。
機能 | 内部的に使われるフレームワーク、OSS |
---|---|
動画ファイルの入出力機能、カメラキャプチャ機能 | Video for Windows(Windowsのみ)、DirectShow(Windowsのみ)、Media Foundation(Windowsのみ)、AVFoundation(macOSのみ)、QTKit(macOSのみ)、Video4Linux(Linuxのみ)、FFmpeg、OpenNI |
※内部的に使われるフレームワーク、OSSは、プラットフォームやOpenCVのビルド設定によって異なります。
2. highguiモジュール
ここでは、highguiモジュールでよく用いられる以下の主な機能について紹介します。
- 画像データのウィンドウ表示
以降、これらの機能と使い方について紹介します。
2.1 画像データのウィンドウ表示
highguiモジュールで提供されている、画像データのウィンドウ表示を行うために用いる主要なAPIと機能の概要は以下の通りです。
関数名 | 機能 |
---|---|
namedWindow | ウィンドウを生成する |
imshow | ウィンドウに画像データを表示する |
waitKey | キー入力を待機する |
destroyAllWindows | ウィンドウを破棄する |
画像データのウィンドウ表示のための主要なAPIと機能の概要 |
2.1.1 API紹介
ここでは、主要なAPIの機能と引数の説明を行います。
【namedWindow関数】ウィンドウを生成する
void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE);
引数 | 引数の説明 |
---|---|
winname | ウィンドウのキャプション名 |
flags | ウィンドウを制御するフラグ(以下のフラグはORで複数同時に指定することもできる)。 ・ WINDOW_NORMAL: ユーザーがウィンドウサイズをリサイズできるようにする ・ WINDOW_AUTOSIZE: 画像サイズに合わせてウィンドウサイズを自動調整する ・ WINDOW_FREERATIO: 画像のアスペクト比を維持せず調整する ・ WINDOW_KEEPRATIO: 画像のアスペクト比を維持する |
上記以外のフラグについては、公式ドキュメント(英語)を参照してください。
【imshow関数】ウィンドウに画像データを表示する
void imshow(const string& winname, InputArray mat);
引数 | 引数の説明 |
---|---|
winname | 画像データの表示に用いるウィンドウ名 |
mat | ウィンドウに表示するMatクラスのインスタンス名 |
【waitKey関数】キー入力を待機する
int waitKey(int delay=0);
引数 | 引数の説明 |
---|---|
delay | 指定した時間(ミリ秒単位)の間、キー入力を待機する。 「0」が指定された場合は、キー入力を無限に待ち続ける |
【destroyAllWindows関数】OpenCVを使って生成した全てのウィンドウを破棄する
void destroyAllWindows();
2.1.2 サンプルプログラム
ウィンドウに画像データを表示するサンプルコードを、以下に示します。
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp> // highguiのヘッダーをインクルード
#include <iostream>
int main(int argc, const char* argv[])
{
// 幅320px、高さ240px、3チャンネルのインスタンスを生成する
cv::Mat img(cv::Size(320, 240), CV_8UC3, cv::Scalar(0, 0, 255));
// (1)ウィンドウを生成する
cv::namedWindow("red image", cv::WINDOW_AUTOSIZE);
// (2)ウィンドウに画像データを表示する
cv::imshow("red image", img);
// (3)キー入力を待機する
cv::waitKey(0);
// (4)ウィンドウを破棄する
cv::destroyAllWindows();
return 0;
}
上記のサンプルコードを実行すると、図1のようなウィンドウが表示されます。(1)cv::namedWindow関数の第1引数の指定によってウィンドウのキャプション名が「red image」になっていること、また、(2)cv::imshow関数の第2引数であるimg(=赤色の画像データ)がウィンドウに表示されていることが分かります。
3. imgcodecsモジュール
ここでは、imgcodecsモジュールでよく用いる以下の機能について紹介します。
- 静止画入出力
3.1 静止画入出力
imgcodecsモジュールで提供されている、静止画入出力を行うために用いる主要なAPIと機能の概要は以下の通りです。
関数名 | 機能 |
---|---|
imread | 画像データをファイルから読み込む |
imwrite | 画像データをファイルに書き出す |
静止画入出力のための主要なAPIと機能の概要 |
3.1.1 API紹介
ここでは、主要なAPIの機能と引数の説明を行います。
【imread関数】画像データをファイルから読み込む
Mat imread(const string& filename, int flags=1 )
引数 | 引数の説明 |
---|---|
filename | 読み込むファイル名(指定した拡張子に応じて画像フォーマットが自動的に選択される) |
flags | 画像データの読み込みを指定するためのフラグ。 ・ cv::IMREAD_UNCHANGED: 画像データの情報を変更せずに読み込む ・ cv::IMREAD_GRAYSCALE: グレースケース化して読み込む ・ cv::IMREAD_COLOR: カラー画像として読み込む |
上記以外のフラグについては、公式ドキュメント(英語)を参照してください。
【imwrite関数】画像データをファイルに書き出す
bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>() )
引数 | 引数の説明 |
---|---|
filename | 書き出すファイル名(指定した拡張子に応じて画像フォーマットが自動的に選択される) |
また、OpenCV 3.1.0は以下の画像フォーマットの入出力をサポートしています。詳細は「公式ドキュメント(英語)」を参照してください。
画像フォーマット | 拡張子 |
---|---|
Windows bitmap | .bmp、.dib |
JPEG | .jpeg、.jpg、.jpe |
JPEG 2000 | .jp2 |
Portable Network Graphics | .png |
WebP | .webp |
Portable image format | .pbm、.pgm、.ppm |
Sun rasters | .sr、.ras |
TIFF | .tiff、.tif |
OpenEXR Image | .exr |
Radiance HDR | .hdr、.pic |
GDAL | Raster、Vectorに列挙されるフォーマット 注:WITH_GDALをONにしてOpenCVをビルドする必要あり |
OpenCV 3.1.0がサポートする画像フォーマット |
3.1.2 サンプルプログラム
画像データをファイルから読み込んで、ファイルに書き出すサンプルコードを、以下に示します。
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp> // imgcodecsのヘッダーをインクルード
#include <iostream>
int main(int argc, const char* argv[])
{
// (1)画像データをファイル(この例では「lena.jpg」)から読み込む
cv::Mat img = cv::imread("lena.jpg", cv::IMREAD_COLOR);
// 画像の読み込みに失敗したらエラー終了する
if(img.empty()) return -1;
// (2)画像データをファイルに書き出す
cv::imwrite("lena.png", img);
return 0;
}
Copyright© Digital Advantage Corp. All Rights Reserved.