/ / メモ
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);

}

トラックバック http://mikanya.dip.jp/memo/2009-11-24-2