OpenCV中的Python线程问题

时间:2019-06-18 14:34:31

标签: python python-3.x opencv python-multiprocessing python-multithreading

我在OpenCV中使用threading模块,遇到了一个奇怪的问题。使用线程时,我无法再次启动相机以进行视频输入。我会拍一帧然后停下来。当使用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()

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

1 个答案:

答案 0 :(得分:0)

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

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

Here是很好的解释,而且冗长。