在子进程中读取一张图片,然后用鼠标在图片上画框,遇到的问题是鼠标响应函数中的位置无法返回的到子进程中
import cv2
import multiprocessing
from multiprocessing import Process, Manager
def OnMouseAction(event, x, y, flags, param):
global position1, position2
if event == cv2.EVENT_LBUTTONDOWN:
position1 = (x, y)
print("p1", position1)
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
position2 = (x, y)
elif event == cv2.EVENT_LBUTTONUP:
position2 = (x, y)
print("p2", position2)
def write() :
cv2.namedWindow('image')
cv2.namedWindow("ROI", cv2.WINDOW_NORMAL)
cv2.setMouseCallback('image', OnMouseAction)
frame=cv2.imread(“1.jpg”,1)
while(1):
if position1 != None and position2 != None:
ls_mat = frame.copy()
cv2.rectangle(ls_mat, position1, position2, (255, 255, 150), 2, 4)
cv2.imshow('image', ls_mat)
if position1[1] < position2[1]:
y1 = position1[1]
y2 = position2[1]
else:
y1 = position2[1]
y2 = position1[1]
if position1[0] < position2[0]:
x1 = position1[0]
x2 = position2[0]
else:
x1 = position2[0]
x2 = position1[0]
roi_lc = frame[y1:y2, x1:x2]
if roi_lc.shape[0] > 10 and roi_lc.shape[1] > 10:
cv2.imshow("ROI", roi_lc)
# if cv2.waitKey(1) & 0xFF == ord('q'):
# ksbz = 1
break
if cv2.waitKey(400) & 0xFF == ord('q'):
break
if __name__ == '__main__':
pw = Process(target=write, args=(i,))
pw.start()
不用多进程,或用多线程能用global实现鼠标的postion的共享,
请问用多进程如何实现
queue
在 OnMouseAction 中提示position1,position2未定义
import cv2
import multiprocessing
from multiprocessing import Process, Manager
def OnMouseAction(event, x, y, flags, param):
global position1, position2
if event == cv2.EVENT_LBUTTONDOWN:
position1.put((x, y))
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
position2.put((x, y))
elif event == cv2.EVENT_LBUTTONUP:
position2.put((x, y))
def write(i, position1, position2):
cv2.namedWindow('image')
cv2.namedWindow("ROI", cv2.WINDOW_NORMAL)
cv2.setMouseCallback('image', OnMouseAction)
frame = cv2.imread("1.bmp", 1)
p1 = (0, 0)
p2 = (200, 50)
while(1):
while(1):
if position1.empty() != True:
p1 = position1.get()
if position2.empty() != True:
p2 = position2.get()
ls_mat = frame.copy()
cv2.rectangle(ls_mat, p1, p2, (255, 255, 150), 2, 4)
cv2.imshow('image', ls_mat)
if p1[1] < p2[1]:
y1 = p1[1]
y2 = p2[1]
else:
y1 = p2[1]
y2 = p1[1]
if p1[0] < p2[0]:
x1 = p1[0]
x2 = p2[0]
else:
x1 = p2[0]
x2 = p1[0]
roi_lc = frame[y1:y2, x1:x2]
if roi_lc.shape[0] > 10 and roi_lc.shape[1] > 10:
cv2.imshow("ROI", roi_lc)
# if cv2.waitKey(1) & 0xFF == ord('q'):
# ksbz = 1
break
if cv2.waitKey(40) & 0xFF == ord('q'):
break
if __name__ == '__main__':
position1 = multiprocessing.Queue()
position2 = multiprocessing.Queue()
i = 1
pw = Process(target=write, args=(i, position1, position2))
pw.start()
pw.join()