81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
import cv2
|
|
import numpy as np
|
|
|
|
'''
|
|
Acquires frames from camera, then adds a red cross as overlay.
|
|
With mouse double clicks, cross can be moved
|
|
'''
|
|
|
|
class ImagePointer:
|
|
center_coord : np.ndarray
|
|
center_size : int
|
|
center_thickness : int
|
|
canvas_name : str
|
|
|
|
def __init__(self):
|
|
# Cross coordinates
|
|
self.center_coord = np.array((0,0))
|
|
self.center_size = 10
|
|
self.center_thickness = 3
|
|
self.canvas_name = 'Image Pointer'
|
|
|
|
# OpenCV callbacks
|
|
def on_mouse_event(self, event, x, y, flags, param):
|
|
# if event == cv2.EVENT_LBUTTONDBLCLK:
|
|
if event == cv2.EVENT_LBUTTONUP:
|
|
# Update cross position
|
|
self.center_coord = np.array((x, y))
|
|
|
|
def on_center_size_change(self, value):
|
|
global center_size
|
|
if value > 0:
|
|
self.center_size = value
|
|
|
|
def on_center_thickness_change(self, value):
|
|
global center_thickness
|
|
if value > 0:
|
|
self.center_thickness = value
|
|
|
|
def run(self):
|
|
# Camera feed
|
|
cam = cv2.VideoCapture(0)
|
|
if not cam.isOpened():
|
|
raise Exception('Cannot open camera')
|
|
ret, frame_cam = cam.read()
|
|
if not ret:
|
|
cam.release()
|
|
raise Exception('Cannot open camera stream')
|
|
|
|
# Put cross in image center as default
|
|
self.center_coord = np.array((int(cam.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cam.get(cv2.CAP_PROP_FRAME_HEIGHT))))
|
|
self.center_coord //= 2
|
|
|
|
cv2.namedWindow(self.canvas_name, cv2.WND_PROP_FULLSCREEN)
|
|
cv2.setMouseCallback(self.canvas_name, self.on_mouse_event)
|
|
|
|
cv2.createTrackbar('center size', self.canvas_name, self.center_size, 100, self.on_center_size_change)
|
|
cv2.createTrackbar('center thickness', self.canvas_name, self.center_thickness, 16, self.on_center_thickness_change)
|
|
|
|
while True:
|
|
# Capture the next frame from camera
|
|
ret, frame_cam = cam.read()
|
|
if not ret:
|
|
print('Cannot receive frame from camera')
|
|
break
|
|
|
|
# Acquire frame
|
|
frame = frame_cam.astype(np.uint8)
|
|
|
|
## Add cross
|
|
frame = cv2.line(frame, self.center_coord - (0, self.center_size), self.center_coord + (0, self.center_size), (0, 0, 255,), self.center_thickness)
|
|
frame = cv2.line(frame, self.center_coord - (self.center_size, 0), self.center_coord + (self.center_size, 0), (0, 0, 255,), self.center_thickness)
|
|
|
|
cv2.imshow(self.canvas_name, frame)
|
|
|
|
# detect ESC key or if window is closeed
|
|
if cv2.waitKey(1) == 27 or cv2.getWindowProperty(self.canvas_name,cv2.WND_PROP_VISIBLE) < 1:
|
|
break
|
|
|
|
cam.release()
|
|
cv2.destroyAllWindows()
|