I am trying to draw a line in a image and I have used mainly the code of this answer.
I want to close the window and return the coordinates after draw the first line, I have modified the code a little bit and what I have for now is:
import numpy as np
import cv2
btn_down = False
def get_points(im):
# Set up data to send to mouse handler
data = {}
data['im'] = im.copy()
data['lines'] = []
# Set the callback function for any mouse event
cv2.imshow("Image", im)
cv2.setMouseCallback("Image", mouse_handler, data)
cv2.waitKey(0) & 0xFF
# Convert array to np.array in shape n,2,2
points = np.uint16(data['lines'])
return points, data['im']
def mouse_handler(event, x, y, flags, data):
global btn_down
if event == cv2.EVENT_LBUTTONUP and btn_down:
#if you release the button, finish the line
btn_down = False
data['lines'][0].append((x, y)) #append the seconf point
cv2.circle(data['im'], (x, y), 3, (0, 0, 255),5)
cv2.line(data['im'], data['lines'][0][0], data['lines'][0][1], (0,0,255), 2)
cv2.imshow("Image", data['im'])
elif event == cv2.EVENT_MOUSEMOVE and btn_down:
#thi is just for a ine visualization
image = data['im'].copy()
cv2.line(image, data['lines'][0][0], (x, y), (0,0,0), 1)
cv2.imshow("Image", image)
elif event == cv2.EVENT_LBUTTONDOWN and len(data['lines']) < 2:
btn_down = True
data['lines'].insert(0,[(x, y)]) #prepend the point
cv2.circle(data['im'], (x, y), 3, (0, 0, 255), 5, 16)
cv2.imshow("Image", data['im'])
if np.array(data["lines"]).shape == (1, 2, 2):
cv2.setMouseCallback("Image", lambda *args : None)
# Running the code
img = cv2.imread('image.jpeg', 1) # Change here your image
pts, final_image = get_points(img)
print(pts)
Is this possible to do with openCV? Thanks in advance
question from:
https://stackoverflow.com/questions/65904754/close-the-window-after-use-the-setmousecallback-with-opencv-in-python