在单独的进程中读取USB cam时,OS X上的OpenCV崩溃

Mik*_*nce 2 python macos opencv multiprocessing

我正在使用OS X(10.8.4)通过cv2 python绑定运行OpenCV 2.4.5.我试图通过多处理模块在一个单独的过程中从USB网络摄像头捕获图像.如果我使用我的笔记本电脑(2011 macbook air)内部网络摄像头,一切似乎都有效,但当我尝试从usb网络摄像头(Logitech C920)读取时,我遇到了崩溃(当我使用没有多处理封装的USB摄像头时没有崩溃) .崩溃日志在这里.我正在使用的代码将可靠地重现崩溃如下.让这项工作对我来说非常重要,所以任何帮助都将非常感谢!

import multiprocessing
import cv2 #doesn't matter if you import here or in cam()

def cam():
    vc = cv2.VideoCapture(0) #modify 0/1 to toggle between USB and internal camera
    while True:
        junk,image = vc.read()

camProcess = multiprocessing.Process( target=cam )
camProcess.start()

while True:
    pass
Run Code Online (Sandbox Code Playgroud)

mka*_*ner 6

你的问题源于python使用os.fork跨越其子进程的方式.Mac上的OpenCV视频后端使用QTKit,它使用CoreFoundation MacOS的这些部分不能保存在分叉子进程中运行,有时它们只是抱怨,有时它们会崩溃.

您需要在不使用os.fork的情况下创建子进程.这可以通过python 2.7实现.

你需要使用台球(https://github.com/celery/billiard/tree/master/billiard)它可以替代蟒蛇多处理,并有一些非常有用的改进.

from billiard import Process, forking_enable
import cv2 #does matter where this happens when you don't use fork

def cam():
    vc = cv2.VideoCapture(0) #modify 0/1 to toggle between USB and internal camera
    while True:
        junk,image = vc.read()

forking_enable(0) # Is all you need!
camProcess = Process( target=cam )
camProcess.start()

while True:
    pass
Run Code Online (Sandbox Code Playgroud)

好吧,让我们添加一个更完整的例子:

from billiard import Process, forking_enable

def cam(cam_id):
    import cv2 #doesn't matter if you import here or in cam()
    vc = cv2.VideoCapture(cam_id) #modify 0/1 to toggle between USB and internal camera
    while True:
        junk,image = vc.read()
        cv2.imshow("test",image)
        k = cv2.waitKey(33)
        if k==27:    # Esc key to stop
            break

def start():

    forking_enable(0) # Is all you need!
    camProcess = Process(target=cam, args=(0,))
    camProcess.start()


if __name__ == '__main__':
    start()
    cam(1)
Run Code Online (Sandbox Code Playgroud)

你需要连接两个摄像头:它应该打开一个窗口并在一个单独的过程中运行每个摄像头(一个在主过程中一个在一个产生的过程中).我使用这种策略在自己的python进程中同时从多个摄像头流式传输图像.