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()函数即可实现。
注意:添加鼠标事件时,用户参数须使用静态变量,不然会被析构的。