实现一个Python程序,用OpenCV调用摄像头显示图片,且每过n
秒print
图片信息。
用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()
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
不符合实际任务的需求。
为了解决上面的问题,我们需要使用多线程技术,即实现程序技术的同时又不影响其他程序的运行。
import threading # 导入多线程的包
def 线程方法(线程参数):
#具体的操作
---------- main ----------
# 创建线程对象
th_1 = threading.Thread(target=线程方法名, daemon=True/False, args=(目标线程的参数1, ))
# 开启线程
th_1.start()
# 主线程(main)的方法
...
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()
这样就计时就不会影响摄像头窗口图像的获取了!