2013年3月31日日曜日

opencv2.4.4をcygwinでつかってみる(2コマ目)

opencvをいじる当シリーズ、動画を扱うのだから1コマ目、2コマ目、というナンバリングにしました.

こちらのページから拝借したコードで線とか円を描くプログラムを動かしてみました.
http://opencv.jp/sample/curves_and_shapes.html#draw_shapes

↓実行すると400x400のwindowが開いてこんなランダムな描画がされます.
ソースコード  (cv_lines.c)
同ページのソースコードだとcvEllipse()の引数が少ないというエラーでコンパイルできません.そこのところを直したのが以下のコードです.

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

int
main (int argc, char **argv)
{
  int i;
  IplImage *img = 0;
  CvRNG rng = cvRNG (time (NULL));
  CvPoint pt1, pt2;
  CvScalar rcolor;
  int irandom;

  // (1)画像領域を確保し初期化する
  img = cvCreateImage (cvSize (400, 400), IPL_DEPTH_8U, 3);
  cvZero (img);

  // (2)ランダムな線分を描画する
  for (i = 0; i < 5; i++) {
    pt1.x = cvRandInt (&rng) % (img->width);
    pt1.y = cvRandInt (&rng) % (img->height);
    pt2.x = cvRandInt (&rng) % (img->width);
    pt2.y = cvRandInt (&rng) % (img->height);
    irandom = cvRandInt (&rng);
    rcolor = CV_RGB (irandom & 255, (irandom >> 8) & 255, (irandom >> 16) & 255);
    cvLine (img, pt1, pt2, rcolor, cvRandInt (&rng) % 4, CV_AA, 0);
  }

  // (3)ランダムな矩形を描画する
  for (i = 0; i < 5; i++) {
    pt1.x = cvRandInt (&rng) % (img->width);
    pt1.y = cvRandInt (&rng) % (img->height);
    pt2.x = cvRandInt (&rng) % (img->width);
    pt2.y = cvRandInt (&rng) % (img->height);
    irandom = cvRandInt (&rng);
    rcolor = CV_RGB (irandom & 255, (irandom >> 8) & 255, (irandom >> 16) & 255);
    cvRectangle (img, pt1, pt2, rcolor, cvRandInt (&rng) % 5 - 1, CV_AA, 0);
  }

  // (4)ランダムな円を描画する
  for (i = 0; i < 5; i++) {
    pt1.x = cvRandInt (&rng) % (img->width);
    pt1.y = cvRandInt (&rng) % (img->height);
    irandom = cvRandInt (&rng);
    rcolor = CV_RGB (irandom & 255, (irandom >> 8) & 255, (irandom >> 16) & 255);
    cvCircle (img, pt1, cvRandInt (&rng) % (img->width / 4) + img->width / 4, rcolor,
              cvRandInt (&rng) % 5 - 1, CV_AA, 0);
  }

  // (5)ランダムな楕円を描画する
  for (i = 0; i < 5; i++) {
    pt1.x = cvRandInt (&rng) % (img->width);
    pt1.y = cvRandInt (&rng) % (img->height);
    irandom = cvRandInt (&rng);
    rcolor = CV_RGB (irandom & 255, (irandom >> 8) & 255, (irandom >> 16) & 255);
    cvEllipse (img, pt1, cvSize (img->width / 2, img->height / 2), irandom % 180, irandom % 90, irandom % 90 + 90,
               rcolor, cvRandInt (&rng) % 5 - 1, 8, 0);
  }

  // (6)画像の表示,キーが押されたときに終了
  cvNamedWindow ("Drawing", CV_WINDOW_AUTOSIZE);
  cvShowImage ("Drawing", img);
  cvWaitKey (0);

  cvDestroyWindow ("Drawing");
  cvReleaseImage (&img);

  return 0;
}

Makefile
INC  = -I/usr/local/include/opencv
LIB  = -L/usr/local/lib
OPT  =  -llibopencv_calib3d \
        -llibopencv_contrib \
        -llibopencv_core \
        -llibopencv_features2d \
        -llibopencv_flann \
        -llibopencv_gpu \
        -llibopencv_highgui \
        -llibopencv_imgproc \
        -llibopencv_legacy \
        -llibopencv_ml \
        -llibopencv_nonfree \
        -llibopencv_objdetect \
        -llibopencv_photo \
        -llibopencv_stitching \
        -llibopencv_ts \
        -llibopencv_video \
        -llibopencv_videostab \
        -lstdc++
cclines:
        gcc cv_lines.c $(INC) $(LIB) $(OPT) -o cv_lines.exe

なにか説明するほどなにかを理解してるわけじゃないので、へ~っ動いた~と思うだけで今日はチャックリとおしまいです.

1コマ目へ  


人気ブログランキングへ

0 件のコメント:

コメントを投稿