python子进程如何和其调用的callback函数共享变量

在子进程中读取一张图片,然后用鼠标在图片上画框,遇到的问题是鼠标响应函数中的位置无法返回的到子进程中

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()