2009-11-24
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); }