問題描述
我正在制作一個非常簡單的程序,它使用 python 中的 opencv 從 Raspberry pi 相機捕獲視頻.我正在使用 Raspbian 作為操作系統(tǒng).我已經(jīng)用 opencv 2.4.5 版本制作了一些程序,現(xiàn)在我已經(jīng)安裝了 opencv 2.4.9.我過去在以前版本的 opencv 上運行的所有程序現(xiàn)在都無法運行,我想我找到了程序給我錯誤的地方.只是嘗試啟動以下代碼:
I'm making a really simple program which capture a video from a Raspberry pi camera, using opencv in python. I'm using Raspbian as OS. I've already made a few programs with the version 2.4.5 of opencv and now i've installed opencv 2.4.9. All the programs that i used to run on the previous version of opencv are not working now, and i think i found the point in which the programs gives me errors. Just trying to launch the following code:
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
resAcquisitionWidth = 160
resAcquisitionHeight = 120
cap.set(3, resAcquisitionWidth);
cap.set(4, resAcquisitionHeight);
cv2.namedWindow('frame')
i = 0
while(True):
print(i)
i = i + 1
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
我得到了錯誤
分段錯誤
我發(fā)現(xiàn)如果我運行相同的代碼,但不嘗試調(diào)整分辨率(因此在第 7-8 行沒有 cap.set() 命令),一切正常.所以它應(yīng)該與此相關(guān).我已經(jīng)看過其他關(guān)于類似錯誤的帖子,所有這些似乎都是出于其他原因.有人知道原因可能是什么嗎?
I found out that if i run the same code, but without trying to adjust the resolution (so without the cap.set() commands on the lines 7-8) everything works fine. So it should be something related with that. I've already seen other posts about similar errors, and all of those seem to come for other reasons. Anybody know what the resasone could be ?
推薦答案
問題可能是 y0u 4re n0t c0d1ng s4f3ly:
cap = cv2.VideoCapture(0)
if not cap:
print "!!! Failed VideoCapture: unable to open device 0"
sys.exit(1)
當調(diào)用 cap.set()
時,您對正在發(fā)生的事情的描述可以被視為 cap
為 null 的證據(jù),因此碰撞.當 VideoCapture()
無法打開該設(shè)備時會發(fā)生這種情況.
You description of what's going on can be seen as evidence that cap
is null when cap.set()
is called, hence the crash. This happens when VideoCapture()
is unable to open that device.
這是什么意思?
- 相機不是設(shè)備
0
(試試其他號碼); - 相機可能未安裝(驅(qū)動程序問題)或未正確連接到您的設(shè)備;
- OpenCV 不支持攝像頭.
然而,在與 OP(提出問題的人)交換了幾條消息后,很明顯崩潰的可能原因是相機不支持指定的分辨率.這就是為什么檢查 API 并注意函數(shù)的返回如此重要的原因.這似乎只是 n0t c0d1ng s4f3ly 的另一種情況.
However, after exchanging a few messages with the OP (person that asked the question), it became clear that the probable cause of the crash is the camera not supporting the specified resolution. That's why is so important to check the API and be aware of the return of the functions. This really seems to be just another case of n0t c0d1ng s4f3ly.
根據(jù)文檔,set()
根據(jù)操作的成功/失敗返回真/假:
According to the docs, set()
returns true/false depending on the success/failure of the operation:
Python:cv.SetCaptureProperty(capture, property_id, value) → retval
Python: cv.SetCaptureProperty(capture, property_id, value) → retval
確保測試這些調(diào)用的返回,如果 set()
失敗,不要讓程序繼續(xù)執(zhí)行.
Make sure to test the return of these calls, and do not let the execution of the program continue if set()
fails.
這篇關(guān)于在 Raspberry 上的 python 中,opencv 的分段錯誤的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!