Thị giác máy tính với OpenCV-Python Bài 2, Phần 4: Thao tác chuột trong hình ảnh
13:25 - 10/12/2021
Trong bài này chúng ta sẽ tìm hiểu cách xử lý các sự kiện chuột trong OpenCV thông qua hàm: cv2.setMouseCallback().
Thị giác máy tính với OpenCV-Python Bài 7 Phần 2: Phát hiện người đi bộ trong video
Thị giác máy tính với OpenCV-Python Bài 7 Phần 1: Phát hiện người đi bộ trong hình ảnh
Thị giác máy tính với OpenCV-Python Bài 6 Phần 2: Phép trừ nền
Thị giác máy tính với OpenCV-Python Bài 6 Phần 1: Bắt bám đối tượng với Meanshift và Camshift
Demo đơn giản
Ở bước này, chúng ta sẽ tạo một ứng dụng đơn giản để vẽ các hình tròn trên hình ảnh ở bất cứ vị trí nào bằng cách nhấp đúp chuột vào đó.
Đầu tiên chúng ta tạo một hàm gọi lại chuột được thực thi khi một sự kiện chuột diễn ra. Sự kiện chuột có thể là bất kỳ thứ gì liên quan đến chuột máy tính như chuột trái, chuột phải, nhấp đúp chuột trái, ... Hàm này cung cấp cho chúng ta tọa độ (x, y) cho mọi sự kiện chuột. Để liệt kê tất cả các sự kiện có sẵn, hãy chạy đoạn code sau đây:
- import cv2
- events = [i for i in dir(cv2) if 'EVENT' in i]
- print events
Kết quả sau khi chạy đoạn code trên:
Tạo chức năng gọi lại chuột có một định dạng cụ thể giống nhau ở mọi nơi. Nó chỉ khác nhau về chức năng. Ở ví dụ này, hàm gọi lại chuột thực hiện một việc, đó là vẽ một vòng tròn ở vị trí nhấp đúp chuột. Chạy đoạn code dưới đây để rõ hơn về điều này:
- import cv2
- import numpy as np
- # mouse callback function
- def draw_circle(event, x, y, flags, param):
- if event == cv2.EVENT_LBUTTONDBLCLK:
- cv2.circle(img, (x,y), 100, (255,0,0), -1)
- # Create a black image, a window and bind the function to window
- img = np.zeros((512, 512, 3), np.uint8)
- cv2.namedWindow('image')
- cv2.setMouseCallback('image', draw_circle)
- while(1):
- cv2.imshow('image',img)
- if cv2.waitKey(20) & 0xFF == 27: //Nhan phim “esc” de thoat
- break
- cv2.destroyAllWindows()
Kết quả sau khi chạy đoạn code trên:
Demo nâng cao
Bây giờ chúng ta sẽ phát triển lên một ứng dụng phức tạp hơn. Trong phần này, chúng ta vẽ hình chữ nhật hoặc hình tròn (tùy thuộc vào chế độ chọn) bằng cách kéo chuột giống như được thực hiện trong ứng dụng Paint. Vì vậy, hàm gọi lại chuột lúc này có hai phần: một để vẽ hình chữ nhật và một để vẽ các hình tròn. Ví dụ cụ thể này sẽ thực sự hữu ích trong việc tạo và hiểu một số ứng dụng tương tác như theo dõi đối tượng, phân đoạn hình ảnh, ... Xem và chạy đoạn code dưới đây:
- import cv2
- import numpy as np
- drawing = False # true if mouse is pressed
- mode = True # if True, draw rectangle. Press 'm' to toggle to curve
- ix, iy = -1, -1
- # mouse callback function
- def draw_circle(event, x, y, flags, param):
- global ix, iy, drawing, mode
- if event == cv2.EVENT_LBUTTONDOWN:
- drawing = True
- ix, iy = x, y
- elif event == cv2.EVENT_MOUSEMOVE:
- if drawing == True:
- if mode == True:
- cv2.rectangle(img, (ix,iy), (x,y), (0,255,0), -1)
- else:
- cv2.circle(img, (x,y), 5, (0,0,255), -1)
- elif event == cv2.EVENT_LBUTTONUP:
- drawing = False
- if mode == True:
- cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
- else:
- cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
Tiếp theo, chúng ta phải ràng buộc chức năng gọi lại chuột này với cửa sổ OpenCV. Trong vòng lặp chính, chúng ta nên đặt liên kết bàn phím cho phím 'm' để chuyển đổi giữa hình chữ nhật và hình tròn.
- img = np.zeros((512, 512, 3), np.uint8)
- namedWindow('image')
- setMouseCallback('image', draw_circle)
- while(1):
- imshow('image',img)
- k = cv2.waitKey(1) & 0xFF
- if k == ord('m'):
- mode = not mode
- elif k == 27:
- break
- destroyAllWindows()
Kết quả sau khi chạy đoạn code trên:
Ở phần tiếp theo chúng ta sẽ tìm hiểu cách hiển thị bảng chỉnh màu sắc thông qua các hàm của OpenCV.
(Sưu tầm)
VIỆN IMC
Tòa nhà IMC Tower, Số 176 Trường Chinh, Phường Khương
Thượng, Quận Đống Đa, Thành phố Hà Nội, Việt Nam
Tel/Fax : (+84) 24 3566 6232 / 24 3566 6234
Email: contact@imc.org.vn Website: https://imc.org.vn