namedWindow正在显示但无法正常工作

时间:2018-06-04 10:48:32

标签: c++ opencv mouseevent

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

#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。

2 个答案:

答案 0 :(得分:0)

向其添加圆圈时,您不会在窗口中更新图像。你应该在回调函数中做到这一点。我尝试了以下代码并且它可以工作。

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;
}

答案 1 :(得分:0)

您的weeks_read_only = {} if read_only_condition_required: weeks_read_only['readonly'] = '' Field('weeks', css_class='numberinput text-center', **weeks_read_only) 功能需要imshow。在CallBackFunc的末尾,您必须添加以下行:

CallBackFunc

因为您的主管中的imshow("img", (*(Mat*)userdata)); 未获得您在imshow

中所做的修改