opencvのcv::setMouseCallback()を用いると、cv::imshow()を使用した際に、マウスのクリックやポインターの位置に応じていろいろな処理を追加できます。
void cv::setMouseCallback (
const String & winname,
MouseCallback onMouse,
void * userdata = 0
)
以下のコードでは、マウスカーソルの位置に合わせて、カーソル位置のuv座標と、画素情報をコンソールに出力します。
cv::Mat colorImg = cv::imread("sample.png", cv::IMREAD_COLOR);
cv::Mat srcImg;
cv::cvtColor(colorImg, srcImg, cv::COLOR_BGR2GRAY);
cv::imshow("test", srcImg);
cv::setMouseCallback("test", [](int event, int x, int y, int flags, void* param)->void {
cv::Mat* showImg = static_cast<cv::Mat*>(param);
if (event == cv::EVENT_MOUSEMOVE) {
if (showImg->type() == CV_8UC1) {
printf("%d %d: %d\n", x, y, showImg->ptr<u_char>(y)[x]);
return;
}
printf("%d %d\n", x, y); // グレースケールでない場合はカーソルの位置のみを出力
}
}, (void*)&srcImg);
cv::waitKey(0);
cv::destroyWindow("test");
setMouseCallbackの第3引数に渡した画像データsrcImgが、コールバック関数のparamに入ります。
第2引数の関数内でカーソル位置の画素をparamから取り出せば、画素が取り出されます。
動かない例
ラムダ式のキャプチャ項に表示する画像を渡す形では、コンパイルエラーとなります。
cv::setMouseCallback("test", [srcImg](int event, int x, int y, int flags, void* param)->void {
// ^^^^^^
cv::Mat* showImg = new cv::Mat(srcImg);
if (event == cv::EVENT_MOUSEMOVE) {
if (showImg->type() == CV_8UC1) {
printf("%d %d: %d\n", x, y, showImg->ptr<u_char>(y)[x]);
return;
}
printf("%d %d\n", x, y);
}
});