0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenCV imshowでマウスカーソルの位置の画素を取得する

Posted at

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);
        }
    });
0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?