【问题标题】:namedWindow is displaying, but not workingnamedWindow 正在显示,但不工作
【发布时间】:2018-06-04 20:31:55
【问题描述】:

我正在开发将通过鼠标在图像上绘制红点的程序。 `

#include <stdio.h>
#include <iostream>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core/utility.hpp>
#include <opencv2/opencv.hpp>

using namespace cv; 
using namespace std;

void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{
    printf("Test");
    if (event == EVENT_LBUTTONDOWN)
    {
        printf("LBUTTON DOWN %d, %d \n", x, y);
        circle( (*(Mat*)userdata), Point(x, y), 2, CV_RGB(255, 0, 0), 3);
        imshow("img", *(Mat*)userdata);//ADDED
    }
    else if(event == EVENT_RBUTTONDOWN)
    {
        printf("RBUTTON DOWN %d, %d \n", x, y);
    }
    else if (event == EVENT_MBUTTONDOWN)
    {
        printf("MBUTTON DOWN %d, %d \n", x, y);
    }
    else if (event == EVENT_MOUSEMOVE)
    {
        printf("MOVE %d, %d \n", x, y);
    }

}

int main(int, char)
{
    namedWindow("img", 0);
    Mat img = imread("blank.jpg");
    setMouseCallback("img", CallBackFunc, &img);
    imshow("img", img);

    waitKey();
    return 0;
}

图像显示正确,但控制台窗口中没有显示任何信息,并且图像上没有出现点。 我的代码基于以下链接中的教程: https://youtu.be/iWCqjWTx-wI 编辑:在回调函数程序中添加更新行后仍然无法正常工作。 “测试”未出现在命令窗口中。 'namedWindow' 函数可能有问题。我正在使用 Windows 7、Visual Studio 2015、OpenCV 3.3.1。

【问题讨论】:

  • 在回调函数的开头添加一个 printf 来测试回调是否正常工作。之后找出为什么根本没有调用回调函数或为什么没有设置事件。

标签: c++ opencv mouseevent


【解决方案1】:

向窗口中添加圆圈时,您不会更新窗口中的图像。您应该在回调函数中执行此操作。我尝试了以下代码,它可以工作。

using namespace cv;
using namespace std;

void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{
    if (event == EVENT_LBUTTONDOWN)
    {
        printf("LBUTTON DOWN %d, %d \n", x, y);
        circle((*(Mat*)userdata), Point(x, y), 2, CV_RGB(255, 0, 0), 3);
        imshow("img", *(Mat*)userdata); // ADDED
    }
    else if (event == EVENT_RBUTTONDOWN)
    {
        printf("RBUTTON DOWN %d, %d \n", x, y);
    }
    else if (event == EVENT_MBUTTONDOWN)
    {
        printf("MBUTTON DOWN %d, %d \n", x, y);
    }
    else if (event == EVENT_MOUSEMOVE)
    {
        printf("MOVE %d, %d \n", x, y);
    }

}

int main(int, char)
{
    namedWindow("img", 0);
    Mat img = imread("squares.png");
    setMouseCallback("img", CallBackFunc, &img);
    imshow("img", img);

    waitKey();
    return 0;
}

【讨论】:

    【解决方案2】:

    您的CallBackFunc 函数中需要一个imshow。在CallBackFunc 的末尾,您必须添加这一行:

    imshow("img", (*(Mat*)userdata)); 
    

    因为您 main 中的 imshow 没有得到您在 CallBackFunc 中所做的修改

    【讨论】:

    • 还是什么都没有。我认为这是 namedWindow 函数的问题,它在我的计算机上无法正常工作。对此有何建议?
    • @J.Majcher 我用我的修改测试了你的代码,它工作正常。请您更新您的帖子吗?
    • @J.Majcher 再次在我的机器上正常工作!您是否在终端上打印了 LBUTTON DOWN?
    • 不行:
    • @J.Majcher 好的,然后告诉我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2018-09-16
    相关资源
    最近更新 更多