美文网首页
二、opencv 读取本机摄像头

二、opencv 读取本机摄像头

作者: 风一般的男人 | 来源:发表于2022-02-28 08:53 被阅读0次

    读取本地摄像头比较简单,下面直接看代码就行。

    原始版

    import cv2
    
    cap = cv2.VideoCapture(0)
    
    while cap.isOpened():
        ret,frame = cap.read()
        cv2.imshow("frame",frame)
        cv2.waitKey(1)
    

    优化版本

    使用了多进程程和队列处理摄像头传输过来的图像帧,程序更加流畅
    multiprocessing是pyhton下的进程管理包,像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多.

    import cv2
    import multiprocessing as mp
    
    def queue_img_put(q):
        cap = cv2.VideoCapture(0)
        # cap.set(3,1280) #设置分辨率
        # cap.set(4,720)
        # cap.set(3,640) #设置分辨率
        # cap.set(4,480)       
        while True:
            is_opened, frame = cap.read()
            q.put(frame) #if is_opened else None
    
    def queue_img_get(q, window_name):
        while True:
            frame = q.get()  
            cv2.imshow("frame",frame)     
            #需要进行wait 不然窗口一闪而过   
            cv2.waitKey(1)
    
    def run():
    
        mp.set_start_method(method='spawn')  # multi-processing init
        queue = mp.Queue(maxsize=2)
        processes = [mp.Process(target=queue_img_put, args=(queue)),
                     mp.Process(target=queue_img_get, args=(queue))]
    
        [setattr(process, "daemon", True) for process in processes]  # process.daemon = True
        [process.start() for process in processes]
        [process.join() for process in processes]
    
    
    if __name__ == '__main__':
        run()
    pass
    

    为什么要使用python多进程?

    因为python使用全局解释器锁(GIL),他会将进程中的线程序列化,也就是多核cpu实际上并不能达到并行提高速度的目的,而使用多进程则是不受限的,所以实际应用中都是推荐多进程的。
    如果每个子进程执行需要消耗的时间非常短(执行+1操作等),这不必使用多进程,因为进程的启动关闭也会耗费资源。
    当然使用多进程往往是用来处理CPU密集型(科学计算)的需求,如果是IO密集型(文件读取,爬虫等)则可以使用多线程去处理。

    相关文章

      网友评论

          本文标题:二、opencv 读取本机摄像头

          本文链接:https://www.haomeiwen.com/subject/ihyhrrtx.html