在单击时将文本添加到鼠标位置时会产生细分错误

时间:2019-05-14 10:37:49

标签: c++ opencv computer-vision

我正在尝试为程序编写代码,当用户在单击位置单击图像时,我应该显示其RGB值。

我仔细阅读了OpenCV的文档,发现putText函数将帮助我实现所需的结果。我按照OpenCV中的文档编写了代码。

这是我的代码

cv::Mat img;
void mouse_Callback(int event , int x , int y , int flag ,void *params)
{
    if(event == cv::EVENT_LBUTTONDOWN)
    {
        cv::Vec3b vec = img.at<cv::Vec3b>(x,y);
        int b,g,r;
        b = (int)vec(0);
        g = (int)vec(1);
        r = (int)vec(2);

        cv::String st = to_string(b);
        cout << b << endl;
        cv::putText(img,st,cv::Point2i(x,y),cv::FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(255,100,250), 1, CV_AA);

        cv::imshow("image",img);
    }
}

int main()
{
    cv::namedWindow("image",CV_WINDOW_AUTOSIZE);
    img = cv::imread("1.jpg",-1);

    cv::setMouseCallback("image",mouse_Callback);

    cv::imshow("image",img);

    char key = cv::waitKey(0);
    if(key==27)
    {
        cv::destroyAllWindows();
    }
    return 0;
}

在运行了前两,三次单击后,我得到了正确的输出。

谢谢。

1 个答案:

答案 0 :(得分:2)

实际问题位于mouse_Callback(...)函数中,更具体地说:

cv::Vec3b vec = img.at<cv::Vec3b>(x, y);

通过查看.at运算符上的OpenCV文档,我们看到,第一个参数表示行索引,第二个参数表示列索引。现在,当您使用图像坐标(x, y)时,例如通过鼠标单击获取图像,然后x对应于列索引,y对应于行索引!

因此,简单的解决方法就是切换xy

cv::Vec3b vec = img.at<cv::Vec3b>(y, x);