C++とOpenCVでマウスイベントを処理する方法|マウスポインタの追跡とクリック検出
OpenCVにおけるマウスイベント処理とは
マウスイベントは、OpenCVが提供する最も便利な機能のひとつです。OpenCVを使えば、マウスポインタの現在位置をリアルタイムで追跡できるだけでなく、左クリック・右クリック・中クリックといった操作の検出も可能です。
OpenCVはロボティクスやコンピュータビジョンの分野で幅広く活用されており、これらの分野ではマウスポインタやクリック操作の追跡が頻繁に利用されます。たとえば、画像上の関心領域(ROI)をマウスでドラッグして指定したり、特定の座標をクリックしてオブジェクトを選択したりするインタラクティブな処理がその代表例です。
本記事では、画像上のマウスポインタの位置を追跡し、クリック操作を検出する方法を、サンプルコードとともにわかりやすく解説します。
サンプルプログラム:マウスイベントの追跡
以下のプログラムは、マウスポインタの移動位置と各種クリック操作を検出し、コンソールに出力する例です。
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
void locator(int event, int x, int y, int flags, void* userdata){ //マウスの移動とクリックを追跡する関数//
if (event == EVENT_LBUTTONDOWN){ //左ボタンがクリックされたとき//
cout << "Left click has been made, Position:(" << x << "," << y << ")" << endl;
} else if (event == EVENT_RBUTTONDOWN){ //右ボタンがクリックされたとき//
cout << "Rightclick has been made, Position:(" << x << "," << y << ")" << endl;
} else if (event == EVENT_MBUTTONDOWN){ //中ボタンがクリックされたとき//
cout << "Middleclick has been made, Position:(" << x << "," << y << ")" << endl;
} else if (event == EVENT_MOUSEMOVE){ //マウスポインタが移動したとき//
cout << "Current mouse position:(" << x << "," << y << ")" << endl;
}
}
int main() {
Mat image = imread("bright.jpg");//画像をMatオブジェクトに読み込む//
namedWindow("Track");//画像を表示するウィンドウを作成//
setMouseCallback("Track", locator, NULL);//指定したウィンドウにマウスコールバック関数を登録//
imshow("Track", image);//ウィンドウに画像を表示//
waitKey(0);//キー入力を待機//
return 0;
}プログラムの解説
コールバック関数「locator」の役割
ウィンドウ上でマウス操作が行われるたびに、OpenCVは登録されたコールバック関数を自動的に呼び出します。サンプルのlocator関数では、引数として渡されるeventの種類を判定し、対応する処理を実行しています。
- EVENT_LBUTTONDOWN:左ボタンが押されたときに発生
- EVENT_RBUTTONDOWN:右ボタンが押されたときに発生
- EVENT_MBUTTONDOWN:中ボタン(ホイールボタン)が押されたときに発生
- EVENT_MOUSEMOVE:マウスポインタがウィンドウ上で移動するたびに発生
また、引数のxとyにはイベント発生時のウィンドウ上の座標が格納されているため、クリックの種類と同時に位置情報も取得できます。
setMouseCallback関数
setMouseCallbackは、指定したウィンドウにマウスイベント用のコールバック関数を登録するための関数です。第1引数にウィンドウ名、第2引数にコールバック関数、第3引数にはコールバック関数へ渡したい任意のデータ(ここではNULL)を指定します。
なお、flags引数を利用すると、イベント発生時にCtrl・Shift・Altキーが押されているかどうかも判別できるため、より高度なインタラクションの実装にも対応できます。
実行結果
プログラムを実行してウィンドウ上でマウスを動かすと、コンソールに現在のマウス座標が連続的に表示されます。また、左・右・中ボタンをクリックすると、クリックの種類とその座標が出力されます。


まとめ
OpenCVのsetMouseCallbackを使えば、マウスポインタの位置追跡やクリック検出を簡単に実装できます。これらの機能を組み合わせることで、画像上での座標指定や領域選択など、インタラクティブなコンピュータビジョンアプリケーションの開発につなげられます。
-
C++とOpenCVで二値画像(バイナリイメージ)を反転する方法
二値画像(バイナリイメージ)の反転とは、ピクセル値を逆転させる処理のことです。視覚的な観点から見ると、二値画像を反転させると、白いピクセルは黒へ、黒いピクセルは白へと変換されます。この処理は、主に3つの関数を組み合わせて実現します。それぞれの手順を順番に見ていきましょう。ステップ1:カラー画像をグレースケールに変換するまず、cvtColor()関数を使って元の画像をグレースケール画像に変換します。この関数の基本形は次の通りです。cvtColor(original_image, grayscale_image, COLOR_BGR2GRAY);ステップ2:グレースケール画像を二値化する続いて、グ
-
C++とOpenCVでバイナリ画像(二値画像)を作成する方法を解説
バイナリ画像(二値画像)とは、黒と白の2色のみで表現されるデジタル画像のことです。画像処理の観点から見ると、バイナリ画像は「0」と「1」という2つの値しか持たないピクセルで構成されています。ピクセルの値が0の場合は純粋な黒を、値が1の場合は純粋な白を表します。グレースケール画像では、各ピクセルが256段階の異なる値を持つのに対し、バイナリ画像では2つの値しか存在しません。このシンプルさゆえに、バイナリ画像はさまざまな用途で活用されています。例えば、モルフォロジー変換(形態学的処理)ではバイナリ画像が必要であり、背景から物体の形状を抽出する処理にもバイナリ画像が用いられます。OpenCVを使用す