最新ページ

2009-12-07 Mon

OpenCVのD言語用ポーティング [D言語][OpenCV]

D言語友の会OpenCVのD言語用ポーティングが投稿された。

同じ様な事をしていたので参考になる。

2009-11-26 Thu

OpenCV の記事のサンプルがコンパイルできるようになった [D言語][OpenCV]

OpenCV の記事のサンプルが動く程度に変換した。
- cv.d
- cvtypes.d
- cxcore.d
- cxtypes.d
- highgui.d

OpenCVで学ぶ画像認識:第3回 オブジェクト検出してみよう|gihyo.jp … 技術評論社

module sample;

pragma(lib,"cv200.lib");
pragma(lib,"cxcore200.lib");
pragma(lib,"highgui200.lib");

private import opencv.c.cxcore;
private import opencv.c.highgui;
private import opencv.c.cvtypes;
private import opencv.c.cv;

private import std.string;

void main()
{
    /* 画像のロード */
    string imgfile = "photo.jpg";
    IplImage* image = cvLoadImage(toStringz(imgfile),1);

    /* 正面顔検出器のロード */
    CvHaarClassifierCascade* cascade = cast(CvHaarClassifierCascade*)cvLoad( "haarcascade_frontalface_default.xml" );

    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* faces;

    /* 顔検出 */
    faces = cvHaarDetectObjects(image,cascade,storage);

    /* 顔領域の描画 */
    for(int i = 0;i < faces.total; i++)
    {
        /* extract the rectanlges only */
        CvRect face_rect = *cast(CvRect*)cvGetSeqElem(faces,i);
        cvRectangle(image,cvPoint(face_rect.x,face_rect.y),
                    cvPoint((face_rect.x+face_rect.width),
                            (face_rect.y+face_rect.height)),
                    CV_RGB(255,0,0),3);
    }

    /* 画像の表示 */
    cvReleaseMemStorage(&storage);
    cvNamedWindow("face_detect",0);
    cvShowImage("face_detect",image);
    cvWaitKey(0);
    cvReleaseHaarClassifierCascade(&cascade);
    cvReleaseImage(&image);

}

2009-11-24 Tue

OpenCV のサンプルがコンパイルできるようになった [D言語][OpenCV]

OpenCV のサンプルが動く程度に変換した。
- cxcore.d
- cxtypes.d
- highgui.d

トラックバーの利用 cvCreateTrackbar, cvGetTrackbarPos, cvSetTrackbarPos

module sample;

pragma(lib,"highgui200.lib");
pragma(lib,"cxcore200.lib");

import opencv.c.highgui;
import opencv.c.cxtypes;
import opencv.c.cxcore;

import std.conv;
import std.string;

CvFont font;
IplImage* img;

void main()
{
    // (1)画像領域を確保し,初期化する
    img = cvCreateImage (cvSize (400, 200), IPL_DEPTH_8U, 3);
    cvZero (img);
    cvInitFont (&font, CV_FONT_HERSHEY_DUPLEX, 1.0, 1.0);

    // (2)ウィンドウ,およびトラックバーを作成する
    cvNamedWindow("Image",CV_WINDOW_AUTOSIZE);
    cvCreateTrackbar ("Trackbar1", "Image", null, 100, &on_trackbar1);
    cvCreateTrackbar ("Trackbar2", "Image", null, 100, &on_trackbar2);
    cvShowImage ("Image", img);
    cvWaitKey(0);

    cvDestroyWindow("Image");
    cvReleaseImage (&img);
}

extern(C) void on_trackbar1(int val)
{

  // (3)トラックバー2を,トラックバー1に同期させる
  cvSetTrackbarPos ("Trackbar2", "Image".ptr, val);

  // (4)トラックバー1の値を描画する
  cvRectangle (img, cvPoint (0, 0), cvPoint (400, 50), cvScalar (0), CV_FILLED, 8, 0);
  cvPutText (img, toStringz(to!(string)(val)), cvPoint (15, 30), &font, CV_RGB (0, 200, 100));
  cvShowImage ("Image", img);

}
extern(C) void on_trackbar2(int val)
{
  int pos1, pos2;

  // (5)トラックバー2の移動範囲を,トラックバー1の値±20に限定する
  pos1 = cvGetTrackbarPos ("Trackbar1", "Image");

  if (pos1 > val)
    pos2 = pos1 - 20 < val ? val : pos1 - 20;
  else
    pos2 = pos1 + 20 > val ? val : pos1 + 20;
  cvSetTrackbarPos ("Trackbar2", "Image", pos2);

  // (6)トラックバー2の値を描画する

  cvRectangle (img, cvPoint (0, 50), cvPoint (400, 100), cvScalar (0), CV_FILLED);
  cvPutText (img,toStringz(to!(string)(pos2)), cvPoint (15, 80), &font, CV_RGB (200, 200, 0));
  cvShowImage ("Image", img);

}

2009-11-24 Tue

OpenCV は、Pentium3では動かない [OpenCV]

OpenCV は VS2008 でビルドすると、SSE2 を使う

Pentium3 は SSE2 が動かない。
実行すると、 Illegal Instruction がでる。

Pentium3 で OpenCV を使うために、
cxtypes.h を編集して、コンパイルしなおした。

SSE2 を使わないスイッチがない?
プロジェクトのプリプロセッサで CV_SSE2=0 を指定すればいい?

2009-11-20 Fri

暗黙の型推論が駄目なとき [D言語][OpenCV]

OpenCV のヘッダを変換しているときに
暗黙の型推論を使うとエラーに遭遇した。

こいうヘッダのとき、

#define FOO  point( 0, 0 )
typedef struct Point
{
    int  x,y;
}
Point;
Point point(int x, int y)
{
    Point p;
    p.x = x;
    p.y = y;
    return p;
}

暗黙の型推論を期待して

const FOO = point( 0, 0 ); //FOO は Point 型
sruct Point
{
    int x;
    int y;
}
Point point(int x, int y)
{
    Point p;
    p.x = x;
    p.y = y;
    return p;
}

こう書くと、

Error: forward reference to point

これを、

const Point FOO = point( 0, 0 );

と型を明示する用にすると回避できた。

2009-11-18 Wed

highgui を使ってみる [D言語][OpenCV]

OpenCV をビルドできたかな?
D言語から OpenCV を呼んでみる。

highgui200.lib を coffimplib で変換
highgui200.dll と cxcore200.dll にパスを通す。
以下のソースを作成

module test;
pragma(lib,"highgui200.lib");
extern(C){
    const CV_WINDOW_AUTOSIZE = 1;
    int cvNamedWindow(char* name,int flags);
    void cvDestroyWindow(char* name);
    int cvWaitKey(int delay);
}

void main()
{
    cvNamedWindow(cast(char*)"Window".ptr,CV_WINDOW_AUTOSIZE);
    cvWaitKey(0);
    cvDestroyWindow(cast(char*)"Window".ptr);
}

で、ウインドウが表示された。

リンクするライブラリはデバッグとリリースで
別のライブラリにするべきだろうか?

debug{
    pragma(lib,"highgui200d.lib");
}else{
    pragma(lib,"highgui200.lib");
}

2009-11-15 Sun

OpenCVをダウンロードしてきた [D言語][OpenCV]

インストール
OpenCV Installation Guideを読む
CMakeってのが必要
OpenCV2.0.0をビルドするを読む
ビルド