OpenCVで学ぶ画像認識

第2回 OpenCVを使ってみよう

この記事を読むのに必要な時間:およそ 4.5 分

画像の幾何学変換

次は画像の幾何学的な変換について,画像を回転させる方法を例に説明します。

画像回転プログラム

#include "cv.h"
#include "highgui.h"

int main(int argc, char* argv[])
{
        IplImage* img;  // 入力画像ポインタ
        IplImage* img2; // 出力画像ポインタ
        char imgfile[] = "lena.jpg";    // 読み込み画像ファイル名

        CvMat* rotationMat;     // 回転行列

        // 画像の読み込み
        img = cvLoadImage(imgfile, CV_LOAD_IMAGE_COLOR);        // カラーで読み込み
        img2 = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);    // 画像のメモリ領域割り当て

        // 回転行列領域の確保
        rotationMat = cvCreateMat(2,3,CV_32FC1);

        // 30度の回転行列を求める
        cv2DRotationMatrix(cvPoint2D32f(img->height/2,img->width/2),30,1,rotationMat);

        // 回転
        cvWarpAffine(img,img2,rotationMat);

        // 画像の表示
        cvNamedWindow ("lena", CV_WINDOW_AUTOSIZE);
        cvShowImage ("lena", img2);
        cvWaitKey (0);
        cvDestroyWindow("lena");

        // 画像の解放
        cvReleaseImage(&img);
        cvReleaseImage(&img2);
        
        cvReleaseMat(&rotationMat);

        return 0;
}

画像の回転は,数学的には行列の計算で求めることが出来ます。つまり画像はピクセル値を数値と見なした行列と考え,それに対して回転行列をかけることで,画像を回転させます。

まず回転行列をCvMat型のrotationMatととして宣言します。ここで,cvCreateMat関数を用いて2×3の行列領域を確保します。CV_32FC1とは,行列の1要素が32ビット浮動小数点型であるという宣言です。

次にcv2DRotationMatrixを用いて,回転行列を求めます。1番目の引き数では回転の中心位置を指定しています。ここでは,画像の中心を回転の中心としたいので,入力画像の縦幅と横幅の半分の値をcvPoint2D32f関数で浮動小数点型の点座標に変換しています。

2番目の引き数が,回転させたい角度です。ここでは30度とします。

3番目の引き数が,拡大/縮小を行う比率です。ここでは拡大/縮小は行わないため1としています。

4番目の引き数が出力先の先ほど領域を確保したrotationMatです。

ここで取得できた回転行列を元に,cvWarpAffine関数で画像変換を行います。cvWarpAffine関数は,画像の幾何学変換を行うための関数です。入力画像,出力画像,回転行列をそれぞれ引き数に入れることで,回転画像を得ることができます。

さて,このコマンドを実行した結果,下の図のような結果が出れば成功です。

図5 画像回転結果

図5 画像回転結果

終わりに

というわけで,今回はOpenCVについて,画像処理のプログラムを動かすまで行いました。OpenCVには他にもボカシや二値化など,様々な画像処理関数が用意されてますので,OpenCV付属のマニュアルを見ながら、ぜひ色々と試して見て下さい。

次回はいよいよ,画像から顔を検出するプログラムの作成と,その仕組みについて解説したいと思います。

著者プロフィール

皆川卓也(みながわたくや)

ジェイマジック株式会社のラボに所属する傍ら,慶応義塾大学の博士課程でコンピュータビジョンを研究する社会人ドクター。画像認識とIT技術を融合して新しいソリューションを開発することを生業とする自称テクニカル・ソリューション・アーキテクト。ジェイマジックでは、「顔ちぇき!~誰に似てる?~™」や「SAYL™」のシステムの立ち上げに携わる。

ジェイマジック
URLhttp://www.j-magic.co.jp/
慶応大学 斎藤英雄研究室
URLhttp://www.hvrl.ics.keio.ac.jp/

コメント

コメントの記入