第6回 初めてのOpenCV開発 ― highgui/imgcodecs/videoioモジュール【OpenCV 3.1.0】OpenCV入門【3.0対応】(1/2 ページ)

OpenCVのhighgui、imgcodecs、videoioという3つのモジュールの概要を解説。GUI機能、画像ファイル/動画ファイルの入出力機能、カメラキャプチャ機能などのAPIと、その基本的な使い方を説明する。

» 2016年10月18日 05時00分 公開
「OpenCV入門【3.0対応】」のインデックス

連載目次

ご注意:本記事は、@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
highguiモジュールが提供する機能で内部的に使われるフレームワークやOSS
内部的に使われるフレームワーク、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のみ)、FFmpegOpenNI
videoioモジュールが提供する機能で内部的に使われるフレームワークやOSS
内部的に使われるフレームワーク、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(=赤色の画像データ)がウィンドウに表示されていることが分かります。

図1 ウィンドウに画像データを表示 図1 ウィンドウに画像データを表示

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 RasterVectorに列挙されるフォーマット
注: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;
}

画像データをファイルから読み込んでファイルに書き出すサンプルコード

       1|2 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。