マウスで線を引くプログラム

マウスで表示されたウィンドウに落書きができる
ただしy方向が逆




include <cv.h>
include <highgui.h>
include <stdio.h>
include <ctype.h>

/* グローバル変数 */
CvFont font;
IplImage *frame = 0, *dst = 0;
CvCapture *capture = 0;

/* プロトタイプ宣言 */
void on_mouse(int event, int x, int y, int flags, void *param);

int main(int argc, char **argv)
{
   int c, x, y;
   double w = 320, h = 240;
   IplImage *cpy_img, *dst_img_gray, *msk_img;

   // (1)コマンド引数によって指定された番号のカメラに対するキャプチャ構造体を作成する
   if (argc == 1
|| (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
capture = cvCreateCameraCapture(argc == 2 ? argv[1][0] - '0' : 0);
/* この設定は,利用するカメラに依存する */
   // (2)キャプチャサイズを設定する.  
   cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, w);
   cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, h);
   cvNamedWindow("Capture", CV_WINDOW_AUTOSIZE);
   dst = cvLoadImage ("uesama3.jpg", CV_LOAD_IMAGE_COLOR);

   // (3)カメラから画像をキャプチャする
   while (1) {
frame = cvQueryFrame(capture);

// (2)ウィンドウを作成し,マウスイベントに対するコールバック関数を登録する
cvSetMouseCallback("Capture", on_mouse);

// (2)dst_imgの画像のRedのプレーンだけを2値化してマスクを作成する
cpy_img = cvCloneImage(dst);
dst_img_gray = cvCreateImage(cvGetSize(dst), IPL_DEPTH_8U, 1);
cvSplit(dst, NULL,NULL,dst_img_gray,NULL);
msk_img = cvCloneImage(dst_img_gray);
cvSmooth(dst_img_gray, dst_img_gray, CV_GAUSSIAN, 5);
cvThreshold(dst_img_gray, msk_img, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);
cvCopy(frame, cpy_img, msk_img);
cvShowImage("Capture", cpy_img);

// (3)'Esc'キーが押された場合に終了する
c = cvWaitKey(2);
if (c == '\x1b')
    break;
   }
   cvReleaseImage(&dst);
   cvReleaseImage(&cpy_img);
   cvReleaseImage(&dst_img_gray);
   cvReleaseImage(&msk_img);

   cvReleaseCapture(&capture);
   cvDestroyWindow("Capture");

   return 0;
}

/* コールバック関数 */
void on_mouse(int event, int x, int y, int flags, void *param = NULL)
{
   char str[64];
   // (5)マウスボタン,修飾キーを取得
   if (flags & CV_EVENT_FLAG_LBUTTON) {
cvCircle(dst, cvPoint(x, y), 1, cvScalar(255,255,255), 10);
//cvRectangle(dst, cvPoint(x-1, y-1),cvPoint(x+1, y+1),cvScalar(255,255,255), -1);
//cvCircle(dst, cvPoint(x, y), 2, cvScalar(0,0,0), 10);
   }
   if (flags & CV_EVENT_FLAG_RBUTTON) {
   /*for (y = 0; y < dst->height; y++) {
   for (x = 0; x < dst->width; x++) {
   dst->imageData[dst->widthStep * y + x * 3] = cvRound(255);
   dst->imageData[dst->widthStep * y + x * 3 + 1] = cvRound(255);
   dst->imageData[dst->widthStep * y + x * 3 + 2] = cvRound(255);
   }
    }*/
cvZero(dst);
   }
   if (flags & CV_EVENT_FLAG_MBUTTON) {
   }
   if (flags & CV_EVENT_FLAG_CTRLKEY) {
   }
   if (flags & CV_EVENT_FLAG_SHIFTKEY) {
   }
   if (flags & CV_EVENT_FLAG_ALTKEY) {
   }
}
最終更新:2009年10月23日 16:38
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。
添付ファイル