namedWindow отображается, но не работает - PullRequest
0 голосов
/ 04 июня 2018

Я работаю над программой, которая будет рисовать красную точку на изображении мышью.`

#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 голосов
/ 04 июня 2018

Вам нужно imshow в вашей функции CallBackFunc.В конце CallBackFunc вы должны добавить эту строку:

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

Поскольку imshow в вашем основном не получает модификацию, которую вы делаете в CallBackFunc

0 голосов
/ 04 июня 2018

Вы не обновляете изображение в окне, когда добавляете в него кружок.Вы должны сделать это в функции обратного вызова.Я попробовал следующий код, и он работает.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...