opencv处理图像调试的时候想获取坐标怎么办?用鼠标事件?

能不能将cv::imshow()函数集成鼠标事件,创造新的显示函数?

于是我们可以这样:

#pragma region showimage
typedef struct Usta { cv::String winname; cv::Mat mat; }usta;
void onMouse(int event, int x, int y, int flags, void* param) {

    usta* im =(usta*)param;
    cv::Mat mat = (im->mat).clone();
    switch (event)
    {    // dispatch the event
    case cv::EVENT_LBUTTONDOWN: // 
        char buff[64];
        sprintf_s(buff, "(%d,%d)", x, y);
        cv::circle(mat, cv::Point(x, y), 6,cv::Scalar(0, 0, 255),2);
        cv::putText(mat, buff, cv::Point(x, y), cv::FONT_HERSHEY_COMPLEX, 2, cv::Scalar(0, 0, 255), 4);
        cv::imshow(im->winname, mat);
        cv::waitKey(1);
        break;
    case cv::EVENT_RBUTTONDOWN: // 
        char bgrbuff[64];
        cv::Vec3b bgr=mat.at<cv::Vec3b>(y, x);
        sprintf_s(bgrbuff, "(BGR:%d,%d,%d)", bgr[0], bgr[1], bgr[2]);
        cv::circle(mat, cv::Point(x, y), 6, cv::Scalar(0, 180, 0), 2);
        cv::putText(mat, bgrbuff, cv::Point(x, y), cv::FONT_HERSHEY_COMPLEX, 2, cv::Scalar(0, 180, 0), 4);
        cv::imshow(im->winname, mat);
        cv::waitKey(1);
        break;
    }
}
void showimage(const cv::String& winname, cv::Mat& mat,int flag=0) {
    cv::namedWindow(winname, flag);
    cv::imshow(winname, mat);
    static usta userdata[512];
    static int index= -1;
    index++;
    userdata[index]={ winname ,mat };
    cv::setMouseCallback(winname, onMouse, userdata+index);
    cv::waitKey(1);
}

鼠标左键显示坐标,右键显示像素值,调用是直接调用showimage()函数即可实现。

注意:添加鼠标事件时,用户参数须使用静态变量,不然会被析构的。

posted on 2021-04-22 09:50  月下叉猹  阅读(103)  评论(0编辑  收藏  举报