为什么这些线程不能同时工作?

时间:2019-02-11 05:44:17

标签: python-3.x

我一直在研究此代码,在这里我需要使用Raspberry pi在opencv中使用单个PiCamera同时捕获视频。还有一个朋友建议使用线程(尽管我看到有些人提到多线程在python中不起作用??),我不知道为什么,在键盘中断后使用程序中的“ q”捕获了第二个视频。 谁能帮助我找到代码出了问题的地方? 我希望同一台摄像机录制多个视频,每个视频之间有1秒的延迟。 这是代码

import cv2
import threading
import time

global tx
tx = []

def cap_1():
        cap = cv2.VideoCapture(0)
        fourcc = cv2.VideoWriter_fourcc(*'XVID')
        out1 = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
        while(cap.isOpened()):
                ret, frame = cap.read()
                if ret == True:
                        out1.write(frame)
                        cv2.imshow('frame',frame)
                        if cv2.waitKey(1) & 0XFF == ord('q'):
                                break
                else:
                        break
        cap.release()
        out1.release()
        cv2.destroyAllWindows()
def cap_2():
        cap2 = cv2.VideoCapture(0)
        fourcc = cv2.VideoWriter_fourcc(*'XVID')
        out2 = cv2.VideoWriter('output1.avi',fourcc, 20.0, (640,480))
        while(cap2.isOpened()):
                ret, frame1 = cap2.read()
                if ret == True:
                        out2.write(frame1)
                        cv2.imshow('frame1',frame1)
                        if cv2.waitKey(1) & 0XFF == ord('q'):
                                break
                else:
                        break
        cap2.release()
        out2.release()
        cv2.destroyAllWindows()



if __name__ == "__main__":
        t1 = threading.Thread(target=cap_1)
        tx.append(t1)
        print(tx)
        t1.start()
        t1.join()

        time.sleep(1)

        t2 = threading.Thread(target=cap_2)
        tx.append(t2)
        t2.start()
        t2.join()

        time.sleep(1)

1 个答案:

答案 0 :(得分:0)

cv2.videoCapture(camIdx)直接从设备中的摄像头获取输入,并且此时尝试拆分线程不会产生所需的结果,因为线程将被顺序化(在大多数系统中,如果并非全部),因为它们会尝试从相机捕获帧,但是您可以通过在读取帧后使用线程来实现您要执行的操作,即可以在写入文件时引入延迟。即在cap.read()函数之后使用线程。