OpenCV hỗ trợ các sự kiện của mouse và keyboard ở mỗi window, do thư viện HighGUI xử lý. Dựa vào đó mà có thể tạo ra các ứng dụng lấy màu ở 1 điểm nào đó, hoặc các chương trình phức tạp tuỳ theo thao tác của người sử dụng.
Khi khởi tạo window thì chúng ta chỉ định sự kiện đó do hàm nào sẽ xử lý, khi thực thi, các sự kiện sẽ được gửi về giá trị int tương ứng. Hàm để chỉ định khai báo như sau:
1 |
setMouseCallback("Window_name", CallBackFunc, NULL); |
Trong đó, Window_name là tên của cửa sổ cần xử lý sự kiện, CallBackFunc là tên hàm, tham số thứ 3 là userdata, mục đích cho người dùng có thể truyền thêm những tham số khác khi xảy ra sự kiện.
Hàm xử lý sự kiện khai báo như sau:
1 |
void CallBackFunc(int event, int x, int y, int flags, void* userdata) |
Trong đó, event là sự kiện, x,y là toạ độ click chuột, flag là tham số kết hợp sự kiện khác như ấn nút Ctrl, Shift, Alt.
Các event xảy ra khi:
-
EVENT_MOUSEMOVE: di chuột
EVENT_LBUTTONDOWN: nhấn chuột trái
EVENT_RBUTTONDOWN: nhấn chuột phải
EVENT_MBUTTONDOWN: nhấn chuột giữa
EVENT_LBUTTONUP: thả chuột trái
EVENT_RBUTTONUP: thả chuột phải
EVENT_MBUTTONUP: thả chuột giữa
EVENT_LBUTTONDBLCLK: nhấp kép chuột trái
EVENT_RBUTTONDBLCLK: nhấp kép chuột phải
EVENT_MBUTTONDBLCLK: nhấp kép chuột giữa
EVENT_MOUSEWHEEL: lăn chuột
EVENT_MOUSEHWHEEL: lăn chuột với bánh xe ngang (con chuột này cực kỳ kiếm)
Các flags là các sự kiện có thể xảy ra đồng thời, khi sử dụng thì kết hợp lại với nhau, bao gồm:
-
EVENT_FLAG_LBUTTON: click chuột trái
EVENT_FLAG_RBUTTON: click chuột phải
EVENT_FLAG_MBUTTON: click chuột giữa
EVENT_FLAG_CTRLKEY: ấn nút Ctrl
EVENT_FLAG_SHIFTKEY: ấn nút Shift
EVENT_FLAG_ALTKEY: ấn nút Alt
Cách sử dụng flags như sau:
EVENT_FLAG_CTRLKEY + EVENT_FLAG_LBUTTON: ấn nút Ctrl + chuột trái
EVENT_FLAG_SHIFTKEY+ EVENT_FLAG_LBUTTON: ấn nút Shift + chuột trái
…..và còn nhiều cách khác nữa
Sử dụng bàn phím: khá là đơn giản
1 |
int key = cv::waitKey(int deltaTime) |
Khi người dùng ấn phím nào đó thì hàm waitKey sẽ trả về giá trị ASCII của phím, các giá trị phổ biến là
-
Enter: 13
Esc: 27
Space: 32
Code ví dụ: khi người dùng click chuột trái thì chương trình sẽ xuất ra toạ độ và giá trị màu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//khai bao anh la bien toan cuc cv::Mat img; void MouseCallBack(int events, int x, int y, int flags, void* userData) { //xuat ra gia tri mau khi click chuot if (events == cv::EVENT_LBUTTONDOWN) { //xuat ra toa do std::cout << x << " - " << y << ": "; cv::Vec3b value = img.at<cv::Vec3b>(y, x); std::cout << (int)value[0] << " " << (int)value[1] << " " << (int)value[2] << "\n"; } } void main() { img = cv::imread("example.jpg", CV_LOAD_IMAGE_UNCHANGED); cv::imshow("Example", img); cv::setMouseCallback("Example", MouseCallBack, NULL); cv::waitKey(0); } |
Đọc thêm: Dựng đứng hình ảnh