Python每过3s打印摄像头图片

0. 目的

实现一个Python程序,用OpenCV调用摄像头显示图片,且每过nprint图片信息。

0.1 使用OpenCV调用摄像头

用OpenCV调用摄像头的程序非常简单,如下:

import cv2


# 定义摄像头对象
cap = cv2.VideoCapture(0)

while True:
    # 获取当前图片
    ret, frame = cap.read()
    # 显示图片
    cv2.imshow("Result", frame)

    # 按下q结束
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

0.2 [错误用法] 直接使用time.sleep函数

如何每隔n秒打印信息,其实最简单的方法就是time.sleep,我们可以看一下效果:

import cv2
import time
import numpy as np


# 定义摄像头对象
cap = cv2.VideoCapture(0)

while True:
    # 获取当前图片
    ret, frame = cap.read()
    # 显示图片
    cv2.imshow("Result", frame)

    # 错误用法:使用time.sleep进行时间间隔获取
    time.sleep(3)
    print(f"图片的shape为: {np.shape(frame)}")

    # 按下q结束
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

打印的信息的确是每隔3s进行的,但是你会发现摄像头的窗口卡死了。因为time.sleep函数会冻结该线程,所以摄像头窗口也被冻结了!
所以直接使用time.sleep不符合实际任务的需求。

1. 多线程的使用

为了解决上面的问题,我们需要使用多线程技术,即实现程序技术的同时又不影响其他程序的运行

1.1 多线程的语法

import threading  # 导入多线程的包


def 线程方法(线程参数):
	#具体的操作

---------- main ----------
# 创建线程对象
th_1 = threading.Thread(target=线程方法名, daemon=True/False, args=(目标线程的参数1, ))
# 开启线程
th_1.start()

# 主线程(main)的方法
...

1.2 [解决方案] 使用多线程的计时

import time
import threading
import numpy as np
import cv2


# 定义计数子线程
def timer(interval):
    while True:  # 无限计时
        time.sleep(interval)
        print(f"{interval}s has pass, and the shape of camera image is: \n{np.shape(img_temp)}")


"""---------------- 主线程(main) -------------------"""
if __name__ == '__main__':
    img_temp = None  # 占位用的,目的是提升frame的作用域
    interval = 2  # 时间间隔(s)

    # 开启一个子线程
    """
        Note:
            1. daemon=
                1. True: 主线程结束,子线程也结束
                2. False:主线程结束,子线程不结束(主线程需等待子线程结束后再结束)
            2. args=(interval, )中的 逗号 不能省略(因为传入的必须是一个tuple)
    """
    # 1. 定义线程
    th1 = threading.Thread(target=timer, daemon=True, args=(interval,))
    # 2. 开启线程
    th1.start()

    # 创建摄像头对象
    cap = cv2.VideoCapture(0)

    while True:
        # 读取图片
        ret, frame = cap.read()
        # 显示图片
        cv2.imshow("Result", frame)

        # 赋值变量
        img_temp = frame  # 将frame赋给img_temp

        # 定义关闭
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

        # 其他的程序

    # 释放资源
    cap.release()
    cv2.destroyAllWindows()

这样就计时就不会影响摄像头窗口图像的获取了!

你可能感兴趣的:(Python,Python相关,python,opencv,计算机视觉)