Я новичок в 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;
}