2005年11月03日

OpenCV

 人工知能学会誌に載ってたので、試しに使ってみた。
 harr特徴量を用いた顔検出は遅いが精度がかなりすごい。正直驚いた。
 重すぎの感はあるが、工夫次第でなんとでもなりそうな感じではある。

 2、3自分で作ったテストプログラムを載せておく。
コマンドライン引数に与えられたファイルを表示するプログラム。
拡張子で自動的に判断して読み込んでくれるのが嬉しい。今どき当り前かもしれないが…。

#include <iostream>
#include <cstdlib>

#include <cv.h>
#include <highgui.h>

using namespace std;

int main(int argc, char* argv[])
{
  if( argc < 2 )
  {
    cout << argv[0] << " ファイル名" << endl;
    exit(-1);
  }

  // IplImage構造体は,画像を表す.OpenCVの中で最も基本的な型.-> cxtypes.h
  IplImage* img = NULL;

  // cvLoadImageは画像を読み込む.
  // 二つ目の引数はカラー画像かどうか.
  //  > 0 - 常にカラー
  //    0 - 常にグレイスケイル
  //  < 0 - ファイルによって自動的に判断する -> highgui.h
  img = cvLoadImage( argv[1], -1 );
  
  // 画像を表示する為のWindowを準備する.
  // 二つ目の引数, CV_WINDOW_AUTOSIZE が設定されている場合は表示する
  // 画像に合わせてリサイズする. -> highgui.h
  cvNamedWindow("TEST Window", CV_WINDOW_AUTOSIZE );

  // 画像を表示する.
  // ウィンドウの識別は文字列でやるようです.->highgui.h
  cvShowImage( "TEST Window", img );

  // キーが押されるまで待つ.
  // 引数はタイムアウト時間.0の場合は永遠に待つ.-> highgui.h
  cvWaitKey(0); 
  
  // 画像を解放する.-> cxcore.h
  cvReleaseImage( &img );
}

引数で与えられた画像をモノクロに変換し、ラプラシアンフィルタをかけて表示するプログラム。
モノクロへの変換はわざわざやらなくてもファイル読み込み時にできると思うが、練習のためやってみた。
IPPを使って最適化してくれてるかどうかは不明。
ものの文書にはIPPをDynamic Linkすればいいみたいなことが書いてあったがホンマかえ。
// 引数に与えられた画像を (モノクロ化し,)
// ラプラシアンフィルタをかけるプログラム
#include <iostream>
#include <cstdlib>

#include <cv.h>
#include <highgui.h>

using namespace std;

int main(int argc, char* argv[])
{
  if( argc < 2 )
  {
    cout << argv[0] << " ファイル名" << endl;
    exit(-1);
  }

  // 画像の読み込み
  IplImage* img = NULL;

  img = cvLoadImage( argv[1], -1 );
  
  // モノクロに変換
  IplImage* img_mono = NULL;
  CvSize size;
  size.width = img->width;
  size.height = img->height;
  img_mono = cvCreateImage( size, img->depth, 1 );
  cvConvertImage( img, img_mono );
  
  // 結果用画像の作成
  IplImage* img_result = cvCreateImage( size, IPL_DEPTH_16S, 1 );

  // ラプラシアンフィルタをかける
  cvLaplace( img_mono, img_result );
  
  // 表示
  cvNamedWindow("TEST Window", CV_WINDOW_AUTOSIZE );
  cvShowImage( "TEST Window", img_result );
  cvWaitKey(0); 

  // 解放
  cvReleaseImage( &img );
  cvReleaseImage( &img_mono );
  cvReleaseImage( &img_result );
}

trackbacks

trackbackURL:

comments

comment form
comment form