01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
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-23 Mon
■ そういう方法もあるのか [D言語]
dsource.org の bindings を眺めてびっくりした。
OpenAL と OpenGL では、
static this で dll をロードしていた。
OpenCV のヘッダを変換している途中で、
この方法を見ちゃうと、もにょもにょする。
std.loader のドキュメントって載っていない。
D言語研究には std.loader のページがあった。
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をビルドするを読む
ビルド
2009-11-13 Fri
■ クラステンプレートとコンストラクタテンプレート [D言語]
D言語にはコンストラクタテンプレートがない。
string wstring dstring 版の
3つのコンストラクタをもつクラス。
class Foo { this(string c){...} this(wstring w){...} this(dstring d){...} }
関数テンプレートのように定義してみる。
class Foo { this(T)(T s){...} }
auto a = new Foo("bar"w);// Error: no constructor for Foo
ドキュメントに載っている通りエラーになる。
かわりに、
クラステンプレートを使ってみる。
class Foo(T) { this(T s){...} }
auto foo = new Foo!(wstring)("bar"w);//wstring 版の Foo のコンストラクタ
どうせなら、クラステンプレートの引数は、
コンストラクタの引数から推論してほしい。
あー
クラステンプレートとコンストラクタテンプレートでは、
意味合いが違うか。
クラステンプレートの場合は、
テンプレート引数ごとに違う型になる。
2009-11-04 Wed
■ opCmp はどう書く? [D言語]
関係式
クラスオブジェクトの場合は、左オペランドに対して Object.opCmp()
の呼び出し結果と整数0、を演算子で比較した結果が式全体の値となります。
クラスの比較
クラスオブジェクトに対しては、
比較演算子はオブジェクトの内容を比較するものです。
従って、
内容を持たない null とオブジェクトを比較するのは不正なコードです。
こう書く。
int opCmp(Object o) in { assert(cast(ComString)o !is null,/* ComString 以外の型と比較したよ的メッセージ */); } body { ComString rhs = cast(ComString)o; if(rhs is null){ throw new Exception(/* ComString 以外の型と比較したよ的メッセージ */); } if(this.toString < rhs.toString){ return -1; }else if(this.toString > rhs.toString){ return 1; } return 0; }
■ 普通にキャストすればいいのか [D言語]
Cast 式
クラスオブジェクトへの参照を派生クラスへとキャストするときは常に、
そのダウンキャストが適切なものであるか実行時のチェックが入ります。
不適切なキャストのときは結果は null になります。
opEquals はこう書けばいいのか。
bool opEquals(Object o){ ComString rhs = cast(ComString)o;//o が ComString 型でないなら null if(rhs is null){ return false; } return this.toString == rhs.toString; }