我正在使用 OpenCV。我有一個視頻檔案,我想以灰度讀取它,而不是轉換為灰度的每一幀。IE
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)
現在在檢查檔案時,我發現讀取函式“該方法/函式在一次呼叫中結合了 VideoCapture::grab() 和 VideoCapture::retrieve()。” 在檢索內部,我們可以傳遞一個標志值。是否可以將其與 read 結合并以灰度讀取而不是顯式轉換?
我試著做
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 中的源代碼,但在 github 上找不到該函式的 Python 源代碼。
uj5u.com熱心網友回復:
根據VideoCaptureModes檔案,有四種可能的模式:
cv2.CAP_MODE_BGR - BGR24 (default)
cv2.CAP_MODE_RGB - RGB24
cv2.CAP_MODE_GRAY - Y8
cv2.CAP_MODE_YUYV - YUYV
另請注意:
目前,這些僅通過 libv4l 后端支持。
因此,要使用 直接將視頻幀讀取為灰度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值是否可行,因為您的作業系統、相機、硬體或后端可能支持也可能不支持。如果回傳值是False或者你得到這樣的錯誤
AttributeError:模塊 'cv2' 沒有屬性 '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()
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/472813.html
