单击时将文本添加到鼠标位置时会出现分段错误

Posted

技术标签:

【中文标题】单击时将文本添加到鼠标位置时会出现分段错误【英文标题】:When adding text to mouse location on click giving segmentation fault 【发布时间】:2019-05-14 10:37:49 【问题描述】:

我正在尝试为一个程序编写代码,当用户在单击位置单击图像时,我应该显示其 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;

在运行前两次或三次单击的代码后,我得到了正确的输出,之后我遇到了分段错误。

谢谢。

【问题讨论】:

欢迎来到 ***!究竟是什么错误?你能详细说明一下吗? 我很确定,您不会遇到分段错误,而是“正常”断言错误。我运行了您的代码,并注意到您在回调中使用了cv::Vec3b vec = img.at&lt;cv::Vec3b&gt;(x, y)。将其更改为cv::Vec3b vec = img.at&lt;cv::Vec3b&gt;(y, x)xy 已切换),应该没问题。 它有效@HansHirse !从早上开始,我就一直在这个错误上浪费时间。在我的笔记本电脑中,它显示分段错误,我不知道为什么。谢谢!!! 我将我的评论转移到一个答案,因为这是一个常见错误,人们可能会遇到您的问题寻求帮助。因此,我恳请您接受我的以下回答,以便将来的读者看到,您的问题可以通过这种方式得到解决。 【参考方案1】:

实际问题出在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);

【讨论】:

以上是关于单击时将文本添加到鼠标位置时会出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

如何通过鼠标单击在 QGraphicsView 中选择位置并添加项目?

单击并拖动多个项目时,QListWidget 导致分段错误

为啥我的 WinForms 上下文菜单没有出现在鼠标所在的位置?

单击外部按钮时将代码添加到CKeditor

JavaScript:通过鼠标单击获取输入文本位置(以字符为单位)

当父元素可拖动时如何允许文本框插入符号位置(在鼠标单击时)