In this section, we will see how to use the mouse to interact with the display window. Let's start with something simple. We will write a program that will detect the quadrant in which the mouse click was detected. Once we detect it, we will highlight that quadrant.
import cv2 import numpy as np def detect_quadrant(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDOWN: if x > width/2: if y > height/2: point_top_left = (int(width/2), int(height/2)) point_bottom_right = (width-1, height-1) else: point_top_left = (int(width/2), 0) point_bottom_right = (width-1, int(height/2)) else: if y > height/2: point_top_left = (0, int(height/2)) point_bottom_right = (int(width/2), height-1) else: point_top_left = (0, 0) point_bottom_right = (int(width/2), int(height/2)) cv2.rectangle(img, (0,0), (width-1,height-1), (255,255,255), -1) cv2.rectangle(img, point_top_left, point_bottom_right, (0,100,0), -1) if __name__=='__main__': width, height = 640, 480 img = 255 * np.ones((height, width, 3), dtype=np.uint8) cv2.namedWindow('Input window') cv2.setMouseCallback('Input window', detect_quadrant) while True: cv2.imshow('Input window', img) c = cv2.waitKey(10) if c == 27: break cv2.destroyAllWindows()
The output will look something like the following image:
Let's start with the main function in this program. We create a white image on which we are going to click using the mouse. We then create a named window and bind the mouse callback function to this window. Mouse callback function is basically the function that will be called when a mouse event is detected. There are many kinds of mouse events such as clicking, double-clicking, dragging, and so on. In our case, we just want to detect a mouse click. In the function detect_quadrant
, we check the first input argument event to see what action was performed. OpenCV provides a set of predefined events, and we can call them using specific keywords. If you want to see a list of all the mouse events, you can go to the Python shell and type the following:
>>> import cv2 >>> print [x for x in dir(cv2) if x.startswith('EVENT')]
The second and third arguments in the function detect_quadrant
provide the X and Y coordinates of the mouse click event. Once we know these coordinates, it's pretty straightforward to determine what quadrant it's in. With this information, we just go ahead and draw a rectangle with the specified color, using cv2.rectangle()
. This is a very handy function that takes the top left point and the bottom right point to draw a rectangle on an image with the specified color.