Почему OpenCV setMouseCallBack не нужен al oop? - PullRequest
0 голосов
/ 28 апреля 2020

Я новичок в C ++ и OpenCV. В настоящее время я изучаю главу об интерфейсе пользователя, которая включает в себя функцию waitKey и функцию setMouseCallBack. Мне любопытно, почему setMouseCallBack не требуется al oop для нескольких событий мыши, в то время как waitKey требуется al oop для нескольких вводов с клавиатуры. Коды, написанные ниже, являются примерами кодов из книги.

Если первый код не имеет времени l oop, то будет прочитан только первый ввод с клавиатуры и код завершится.

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main(void)
{
    Mat img = imread("D://alpaca.jpg");

    if (img.empty()) {
        printf("Image load failed");
        return -1;
    }

    namedWindow("Alpaca", WINDOW_NORMAL);
    imshow("Alpaca", img);

    while (1) {
        int keycode = waitKey();

        if (keycode == 'i' || keycode == 'I') {
            img = ~img;
            imshow("Alpaca", img);
        }
        else if (keycode == 'q' || keycode == 'Q' || keycode == 27) {
            break;
        }
    }
    return 0;
}

Однако во втором коде каждое событие мыши вызывает функцию on_mouse без l oop.

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

Mat img;
Point pt0ld;

void on_mouse(int event, int x, int y, int flags, void*)
{

    switch (event) {
    case EVENT_LBUTTONDOWN:
        pt0ld = Point(x, y);
        cout << "Event_LBUTTONDOWN: " << x << "," << y << endl;
        break;
    case EVENT_LBUTTONUP:
        cout << "Event_LBUTTONUP: " << x << "," << y << endl;
        break;
    case EVENT_MOUSEMOVE:
        if (flags & EVENT_FLAG_LBUTTON) {
            line(img, pt0ld, Point(x, y), Scalar(0, 255, 255), 2);
            imshow("img", img);
            pt0ld = Point(x, y);
        }
        break;
    default:
        break;
    }
}

int main(void)
{

    img = imread("D://alpaca.jpg");

    if (img.empty()) {
        printf("Image Load  Failed!");
        return -1;
    }

    namedWindow("img");
    setMouseCallback("img", on_mouse);

    imshow("img", img);
    waitKey();

    return 0;
}

1 Ответ

0 голосов
/ 28 апреля 2020

Разница в том, что waitKey является функцией. У вас есть прямой звонок на это. В этом случае функция будет блокироваться до тех пор, пока не будет нажата клавиша.

setMouseCallback, поскольку предложенное имя используется для регистрации функции обратного вызова, в данном случае on_mouse. Кто-то еще позвонит on_mouse, когда произойдет событие мыши. Поэтому вам не нужно вызывать функцию on_mouse самостоятельно.

Первый подход называется опросом, потому что вы проверяете непрерывность, если что-то происходит.

Второй метод основан на событиях, потому что когда произойдет событие, будет вызвана функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...