OpenCVで学ぶ画像認識

第2回 OpenCVを使ってみよう

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

画像処理関数を使う

さて,画像を読みこんで表示させることはできました。次はこれに,なんらかの画像変換の処理を加えます。

エッジ抽出処理

では,手始めに画像から階調変化の強い箇所(エッジ)を抽出してみましょう。OpenCVには何種類かのエッジ抽出関数が用意されていますが,ここではCannyのアルゴリズムと呼ばれているものを使うことにします。

エッジ抽出プログラム

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

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

        // 画像の読み込み
        img = cvLoadImage(imgfile, CV_LOAD_IMAGE_GRAYSCALE);    // グレースケールで読み込み
        img2 = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);    // 画像のメモリ領域割り当て

        // エッジ抽出
        cvCanny(img,img2,64,128);

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

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

        return 0;
}

前回のプログラムと違うポイントとしては,まずcvLoadImageによって入力画像を呼び出す際,"CV_LOAD_IMAGE_GRAYSCALE"という引数を与えることで,モノクロ画像として抽出しています。

また,今回は出力の画像ポインタimg2を用意し,それに対しcvCreateImageという関数を用いて領域確保を行っています。

1番目の引き数は画像の縦サイズと横サイズを指定しており,ここではcvGetSize関数を使って入力と同じサイズを割り当てています。2番目の引き数は1ピクセルあたりのデータ型指定で,"IPL_DEPTH_8U"は8bitのUnsigned型(つまり0から255までの値を持つ)を表しています。3番目の引き数の1は,1ピクセルあたりのチャネル数で,ここではモノクロ画像なので1を指定しています。もしカラー画像を使用したい場合は,R,G,Bの三種類のチャネルを容易する必要があるため,この引き数は"3"になります。

エッジ抽出は,cvCanny関数で行います。1番目と2番目の引き数にそれぞれ入力と出力の画像を指定し,3番目と4番目にはエッジ抽出のための弱い閾値と強い閾値の2つを指定します。この2つの閾値はここでは,エッジらしさを2段階で評価している,程度に考えていただければ結構です。

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

図4 エッジ抽出結果

図4 エッジ抽出結果

著者プロフィール

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

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

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

コメント

コメントの記入