lylkr 2022-03-11 18:54 采纳率: 50%
浏览 27
已结题

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的共享,
请问用多进程如何实现

  • 写回答

2条回答 默认 最新

  • lylkr 2022-03-12 00:48
    关注

    在 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()
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月8日
  • 已采纳回答 8月31日
  • 创建了问题 3月11日