白猫学生のブログ

自分の趣味をひたすら投稿するブログ

OpenCVで表示した画像にマウスクリックした場所を取得する方法 (C++)

OpenCVをいじっているとき,表示した画像にマウスでクリックした場所を取得したかったのですが自分に合うサンプルプログラムがなかったので作成しました.

画像を表示して,左クリックをした場所を取得するだけのプログラムです.


もし追加の処理を加えたい場合はコールバック関数の中に処理を追加するか,座標を取得後に処理を追加するのが無難だと思います.

ライブラリはOpenCV3.0を用いましたが,2.4以降であれば同様のプログラムで動作すると思います.

サンプルプログラムではネットから適当に拾ってきた「lena.jpg」を用いております.

#include <iostream>
#include "opencv2/highgui/highgui.hpp" 

//マウス入力用のパラメータ
struct mouseParam {
    int x;
    int y;
    int event;
    int flags;
};

//コールバック関数
void CallBackFunc(int eventType, int x, int y, int flags, void* userdata)
{
    mouseParam *ptr = static_cast<mouseParam*> (userdata);

    ptr->x = x;
    ptr->y = y;
    ptr->event = eventType;
    ptr->flags = flags;
}

int main(void)
{
    mouseParam mouseEvent;

    //入力画像
    cv::Mat input_img = cv::imread("lena.jpg");

    //表示するウィンドウ名
    cv::String showing_name = "input";

    //画像の表示
    cv::imshow(showing_name, input_img);

    //コールバックの設定
    cv::setMouseCallback(showing_name, CallBackFunc, &mouseEvent);

    while (1) {
        cv::waitKey(20);
        //左クリックがあったら表示
        if (mouseEvent.event == cv::EVENT_LBUTTONDOWN) {
            //クリック後のマウスの座標を出力
            std::cout << mouseEvent.x << " , " << mouseEvent.y << std::endl;
        }
        //右クリックがあったら終了
        else if (mouseEvent.event == cv::EVENT_RBUTTONDOWN) {
            break;
        }
    }
    return 0;
}

マウスイベントの種類は以下の通りです.

  • EVENT_MOUSEMOVE
  • EVENT_LBUTTONDOWN
  • EVENT_RBUTTONDOWN
  • EVENT_MBUTTONDOWN
  • EVENT_LBUTTONUP
  • EVENT_RBUTTONUP
  • EVENT_MBUTTONUP
  • EVENT_LBUTTONDBLCLK
  • EVENT_RBUTTONDBLCLK
  • EVENT_MBUTTONDBLCLK

フラグの種類は以下の通りです.これは,マウスイベントが発生したときの状態を表しています.

  • EVENT_FLAG_LBUTTON
  • EVENT_FLAG_RBUTTON
  • EVENT_FLAG_MBUTTON
  • EVENT_FLAG_CTRLKEY
  • EVENT_FLAG_SHIFTKEY
  • EVENT_FLAG_ALTKEY