如何使用OpenCV Python来检查相机是否已经打开
OpenCV是一个开源的Python计算机视觉库。它提供了许多函数来执行各种图像或视频处理操作。该库使用Python的NumPy模块将所有视频或图像数组表示为ndarray类型。
OpenCV-Python需要NumPy库,我们需要确保NumPy模块也已安装在我们的Python解释器中。在本文中,我们将看到如何使用OpenCV Python来检查相机是否已经打开。
检查相机是否已经打开
我们可能无法确定相机的状态,例如它是否被其他应用程序打开或者它是否正常工作。在这些情况下,我们的程序将抛出一个错误而不是创建一个空帧。为了避免这种情况,我们需要首先检查相机的状态。
示例
以下示例简单地打开相机并捕获视频帧,如果相机正常工作,否则将引发错误如下所示。
import cv2
cam = cv2.VideoCapture(0)
ret, frame = cam.read()
cv2.imwrite('image.jpg', frame)
cam.release()
cv2.destroyAllWindows()
输出
---------------------------------------------------------------------------
error Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_8052\746690897.py in
2 cam = cv2.VideoCapture(0)
3 ret, frame = cam.read()
----> 4 cv2.imwrite('image.jpg', frame)
5 cam.release()
6 cv2.destroyAllWindows()
error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp:783: error: (-215:Assertion failed) !_img.empty() in function 'cv::imwrite'
为了避免上述错误,我们需要最初检查相机的状态。
使用cv2.VideoCapture.isOpened()函数
该函数检查cv2.VideoCapture()对象是否开始捕获帧。如果对象开始捕获视频帧,则返回True,否则返回False。
示例
在此示例中,我们将使用isOpened()函数来检查相机的状态。
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(cap.isOpened()): # true when camera is open
while True:
ret, img_array = cap.read()
cv2.imshow('img', img_array)
if cv2.waitKey(1) & 0xff == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
else:
print("Camera is disconnected")
输出
然而,如果相机已经被其他应用程序访问/打开,这种方法将会出错。
让我们看下面的示例来避免上述情况,我们将使用cap.read()函数。
使用cv2.VideoCapture.read()函数
cv2.VideoCapture.read()函数读取帧。该函数返回一个包含2个值的元组(例如:(False,none))−
- ret:这是一个布尔值,如果成功读取帧,则为真,否则为假,通过此值,我们可以检查读取是否成功。
-
frame:这是从相机记录的实际输入帧。该帧可以存储在一个变量中,数据类型是ndarry。
示例
在这个示例中,我们将使用read()函数来检查相机的状态。
import cv2
cap=cv2.VideoCapture(0)
while True:
if cap.read()[0]==False:
print("Camera is disconnected")
break
else:
ret, frame=cap.read()
cv2.imshow("image",frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
输出
Camera is disconnected
这样我们就可以使用Python OpenCV来检查摄像头是否工作。如果摄像头断开连接或者已经被其他应用程序占用/打开,那么上述程序将会显示如上的消息。