首页 > 解决方案 > OpenCV中的Python线程问题

问题描述

threading我在OpenCV中使用模块,遇到了一个奇怪的问题。使用线程时,我无法再次启动相机以获取视频输入。我会拍一帧然后停下来。multiprocessing虽然使用模块时没有这样的问题。我无法理解导致这种奇怪行为的原因。

这段代码总结了我遇到的问题,第二次创建线程时程序会卡住。

import cv2
import time
import threading

def open_cam():
    count = 0
    cam = cv2.VideoCapture(0)
    while True:
        ret_val, img = cam.read()
        print(ret_val)
        cv2.imshow("Image", img)
        count += 1
        if count == 100:
            break
        if (cv2.waitKey(1) & 0xFF) == ord('q'):
            break
    cv2.destroyAllWindows()



def start_thread():
    print("CREATING THREAD")
    cam_thread = threading.Thread(target=open_cam)
    print("STARTING THREAD")
    cam_thread.start()

start_thread()
time.sleep(5)
start_thread()  

但是,此代码完全按照我的意愿工作,它使用multiprocessing模块而不是threading

import cv2
import time
import multiprocessing

def open_cam():
    count = 0   
    cam = cv2.VideoCapture(0)
    while True:
        ret_val, img = cam.read()
        print(ret_val)
        cv2.imshow("Image", img)
        count += 1
        if count == 100:
            break
        if (cv2.waitKey(1) & 0xFF) == ord('q'):
            break
    cv2.destroyAllWindows()



def start_process():
    print("CREATING process")
    cam_process = multiprocessing.Process(target=open_cam)
    print("STARTING process")
    cam_process.start()

start_process()
time.sleep(5)
start_process()

问题的根本原因是什么,我该如何解决?

标签: pythonpython-3.xopencvpython-multiprocessingpython-multithreading

解决方案


这是由全局解释器锁引起的。线程共享程序内存。为了防止由不同线程更改相同变量引起的冲突,Python 将执行锁定到特定线程。这意味着在任何时候只有一个线程运行。当 CPU 空闲时,程序在线程之间切换,使 IO-bound 应用程序运行得更快。相比之下,进程在不同的内核上同时运行并且不共享内存。

当第二个线程在您的代码中启动时,两个线程都尝试访问相同的变量。这会导致线程出错,而进程运行良好。

是优秀且更冗长的解释。


推荐阅读