使用 Python OpenCV cv2.VideoCapture() 直接读取灰度视频帧
Read video frame directly in grayscale with Python OpenCV cv2.VideoCapture()
我正在使用 OpenCV。我有一个视频文件,我想以灰度模式读取它,而不是将每一帧都转换为灰度模式。即
cap = cv2.VideoCapture(VIDEO_PATH)
results = {}
curr_frame = 0
start = time.time()
while(cap.isOpened()):
# Capture frame-by-frame
ret, frame = cap.read()
if ret == True:
curr_frame+=1
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
我不想这样做,而是想像在图像中那样直接以灰度读取它,即
im_gray = cv2.imread('grayscale_image.png', cv2.IMREAD_GRAYSCALE)
现在,在检查文档后,我发现读取函数“method/function 在一个调用中结合了 VideoCapture::grab() 和 VideoCapture::retrieve()”。
在 retrieve 中,我们可以传递一个标志值。可不可以结合读取,灰度读取,而不是显式转换?
我试过
ret, frame = cap.read(flag=0)
但它不是有效的关键字参数。
error: OpenCV(4.5.5) :-1: error: (-5:Bad argument) in function 'read'
> Overload resolution failed:
> - 'flag' is an invalid keyword argument for VideoCapture.read()
> - 'flag' is an invalid keyword argument for VideoCapture.read()
但我可以在 cap.read()
中传入任何随机数并且它有效。
cap.read(-4)
我在 Python 中寻找源代码,但在 Python 中找不到关于 github 上此函数的任何源代码。
根据VideoCaptureModes
documentation,有四种可能的模式:
cv2.CAP_MODE_BGR - BGR24 (default)
cv2.CAP_MODE_RGB - RGB24
cv2.CAP_MODE_GRAY - Y8
cv2.CAP_MODE_YUYV - YUYV
另请注意:
Currently, these are supported through the libv4l backend only.
因此,要使用 cv2.VideoCapture()
直接读取视频帧作为灰度,您必须使用 cv2.CAP_MODE_GRAY
将模式设置为灰度,如下所示:
capture = cv2.VideoCapture(0)
possible = capture.set(cv2.CAP_PROP_MODE, cv2.CAP_MODE_GRAY)
print(possible)
# IMPORTANT: Check this value to see if it's supported by your system
您必须检查返回的 bool
值以查看是否可行,因为您的 OS、相机、硬件或后端可能支持也可能不支持。如果返回值是False
或者你得到这样的错误
AttributeError: module 'cv2' has no attribute 'CAP_MODE_GRAY'
那么不幸的是,这对您的系统来说是不可能的,您能做的最好的事情就是在检索帧后使用 cv2.cvtColor
转换为灰度。
这是一个工作示例,可以直接从网络摄像头读取帧作为灰度图
import multiprocessing as mp
import cv2, time
def capture_frames():
capture = cv2.VideoCapture(0)
possible = capture.set(cv2.CAP_PROP_MODE, cv2.CAP_MODE_GRAY)
print(possible)
# FPS = 1/X, X = desired FPS
FPS = 1/120
FPS_MS = int(FPS * 1000)
while True:
# Ensure camera is connected
if capture.isOpened():
(status, frame) = capture.read()
# Ensure valid frame
if status:
cv2.imshow('frame', frame)
else:
break
if cv2.waitKey(1) & 0xFF == ord('q'):
break
time.sleep(FPS)
capture.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
print('Starting video stream')
capture_process = mp.Process(target=capture_frames, args=())
capture_process.start()
我正在使用 OpenCV。我有一个视频文件,我想以灰度模式读取它,而不是将每一帧都转换为灰度模式。即
cap = cv2.VideoCapture(VIDEO_PATH)
results = {}
curr_frame = 0
start = time.time()
while(cap.isOpened()):
# Capture frame-by-frame
ret, frame = cap.read()
if ret == True:
curr_frame+=1
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
我不想这样做,而是想像在图像中那样直接以灰度读取它,即
im_gray = cv2.imread('grayscale_image.png', cv2.IMREAD_GRAYSCALE)
现在,在检查文档后,我发现读取函数“method/function 在一个调用中结合了 VideoCapture::grab() 和 VideoCapture::retrieve()”。 在 retrieve 中,我们可以传递一个标志值。可不可以结合读取,灰度读取,而不是显式转换?
我试过
ret, frame = cap.read(flag=0)
但它不是有效的关键字参数。
error: OpenCV(4.5.5) :-1: error: (-5:Bad argument) in function 'read'
> Overload resolution failed:
> - 'flag' is an invalid keyword argument for VideoCapture.read()
> - 'flag' is an invalid keyword argument for VideoCapture.read()
但我可以在 cap.read()
中传入任何随机数并且它有效。
cap.read(-4)
我在 Python 中寻找源代码,但在 Python 中找不到关于 github 上此函数的任何源代码。
根据VideoCaptureModes
documentation,有四种可能的模式:
cv2.CAP_MODE_BGR - BGR24 (default)
cv2.CAP_MODE_RGB - RGB24
cv2.CAP_MODE_GRAY - Y8
cv2.CAP_MODE_YUYV - YUYV
另请注意:
Currently, these are supported through the libv4l backend only.
因此,要使用 cv2.VideoCapture()
直接读取视频帧作为灰度,您必须使用 cv2.CAP_MODE_GRAY
将模式设置为灰度,如下所示:
capture = cv2.VideoCapture(0)
possible = capture.set(cv2.CAP_PROP_MODE, cv2.CAP_MODE_GRAY)
print(possible)
# IMPORTANT: Check this value to see if it's supported by your system
您必须检查返回的 bool
值以查看是否可行,因为您的 OS、相机、硬件或后端可能支持也可能不支持。如果返回值是False
或者你得到这样的错误
AttributeError: module 'cv2' has no attribute 'CAP_MODE_GRAY'
那么不幸的是,这对您的系统来说是不可能的,您能做的最好的事情就是在检索帧后使用 cv2.cvtColor
转换为灰度。
这是一个工作示例,可以直接从网络摄像头读取帧作为灰度图
import multiprocessing as mp
import cv2, time
def capture_frames():
capture = cv2.VideoCapture(0)
possible = capture.set(cv2.CAP_PROP_MODE, cv2.CAP_MODE_GRAY)
print(possible)
# FPS = 1/X, X = desired FPS
FPS = 1/120
FPS_MS = int(FPS * 1000)
while True:
# Ensure camera is connected
if capture.isOpened():
(status, frame) = capture.read()
# Ensure valid frame
if status:
cv2.imshow('frame', frame)
else:
break
if cv2.waitKey(1) & 0xFF == ord('q'):
break
time.sleep(FPS)
capture.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
print('Starting video stream')
capture_process = mp.Process(target=capture_frames, args=())
capture_process.start()