![](/img/trans.png)
[英]how do I use OpenCV to read video from a NamedTempFile in python
[英]How can I use OpenCV (Python) to read a video file WITHOUT looping (Mac OS)?
我正在用python寫一個簡單的OpenCV腳本來進行一些機器學習。 我想向它提供一系列視頻文件,它將處理然后退出並吐出一些參數。 但是,當我使用cv2.VideoCapture打開視頻文件時,它會無限循環。 如何檢測我何時播放了視頻的結尾?
**編輯**因此,一些人指出,讀取到達文件末尾時應該返回一個空框架。 我試圖尋找它,它可以在我的Linux機器上運行,但不能在我的Mac上運行。 在Mac上,它只是循環播放並繼續播放,就像文件沒有盡頭一樣。 有任何想法嗎?
讀取循環的代碼如下所示,除非我按esc鍵,否則它會無限循環。
cam = cv2.VideoCapture(sourceVideo)
while True:
ret, img = cam.read()
cv2.imshow('detection', img)
print ret
if (0xFF & cv2.waitKey(5) == 27) or img.size == 0:
break
請注意,ret始終返回True,而img始終是有效數據。 是否有可能我不應該使用VideoCapture()進行此類閱讀? 我不想使用較舊的cv命令,因為我需要使用cv2使用的NumPy數組。
**編輯**好,找到了一個合理的解決方案。 我發現至少有其他人在Mac OS中也遇到了類似的問題: OpenCV捕獲會循環播放視頻/未檢測到最后一幀
我的猜測是Mac OS中的OpenCV設置或文件格式存在問題。
正確的解決方案通常是檢查返回的幀的類型,因此這應該可行:
cam = cv2.VideoCapture(sourceVideo)
while True:
ret, img = cam.read()
if (type(img) == type(None)):
break
cv2.imshow('detection', img)
print ret
if (0xFF & cv2.waitKey(5) == 27) or img.size == 0:
break
但是,如果您遇到問題,則不會檢測到最后一幀。 無論如何,有一個合理的解決方法,即檢查文件中的幀數並簡單地進行跟蹤。
framecount = cam.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)
frames = 0
while frames < framecount:
ret, img = cam.read()
frames += 1
if (type(img) == type(None)):
break
cv2.imshow('detection', img)
print ret
if (0xFF & cv2.waitKey(5) == 27) or img.size == 0:
break
不要忘記添加檢查視頻文件是否已成功打開。
if( !cam.isOpened() )
throw "Error when reading image file";
通過將它們通過管道傳送到cv :: Mat中來抓取幀
Mat frame;
for( ; ; )
{
cam >> frame;
if(!frame)
break;
imshow("w", frame);
waitKey(20);
}
如果幀為假,則循環應正確終止。
為了也完全終止循環,您可以執行
cam.get(CV_CAP_PROP_FRAME_COUNT)
以獲得確切的幀數。 無法獲得無循環的視頻,因為其增量讀取。 您可以將其包裝到單獨的函數中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.