[英]OpenCV multiple USB camera on Raspberry Pi 3
我之前看過很多與此相關的問題,但都無濟於事。
我的設置:
/dev/video0
和/dev/video1
對於這兩個攝像機中的任何一個,我都可以捕獲圖像並以相當不錯的速率顯示它們,並且延遲最小(偶爾出現偽像)。
但是,當我嘗試同時使用兩者時, 可能會得到十分之一的幀速率(盡管幀之間的延遲似乎隨每個幀而變化),並帶有各種令人討厭的圖像偽影(例如,參見下文),並且出現了無法忍受的延遲。
問題似乎不在於相機本身或設備上的USB帶寬:將相機連接到Windows PC時,我能夠以30 FPS的速度捕獲和顯示圖像,而沒有任何視覺偽像且幾乎沒有滯后。
據我所知,這一定是Pi硬件,驅動程序或OpenCV。 我不認為這是Pi硬件。如果我能用兩台攝像機實現一台攝像機獲得的一半幀速(我不明白為什么不應該這樣做)並且沒有丑陋的偽像,我會很高興。
有沒有人有什么建議? 我最終只是想將來自兩台攝像機的視頻從Pi傳輸到桌面。 如果有不涉及OpenCV的建議,我會全力以赴。 我沒有嘗試對Pi上的圖像進行任何渲染或操作,但是openCV是我發現的唯一能夠以相當快的速度(當然,使用一台攝像機)捕獲圖像的東西。
僅供參考,我正在使用的簡單python腳本是這樣的:
import cv2
import numpy as np
import socket
import ctypes
import struct
cap = []
cap.append(cv2.VideoCapture(0))
cap.append(cv2.VideoCapture(1))
#grab a single frame from one camera
def grab(num):
res, im = cap[num].read()
return (res,im)
#grab a frame from each camera and stitch them
#side by side
def grabSBS():
res, imLeft = grab(1)
#next line is for pretending I have 2 cameras
#imRight = imLeft.copy()
res, imRight = grab(0)
imSBS = np.concatenate((imLeft, imRight), axis=1)
return res,imSBS
###For displaying locally instead of streaming
#while(False):
# res, imLeft = grab(0)
# imRight = imLeft.copy()
# imSBS = np.concatenate((imLeft, imRight), axis=1)
# cv2.imshow("win", imSBS)
# cv2.waitKey(20)
header_data = ctypes.create_string_buffer(12)
while(True):
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.bind(("10.0.0.XXX", 12321))
sck.listen(1)
while(True):
(client, address) = sck.accept()
print "Client connected:", address
try:
while(True):
res,im = grabSBS()
if(res):
success, coded = cv2.imencode('.jpg', im)
if (success):
height, width, channels = im.shape
size = len(coded)
struct.pack_into(">i", header_data , 0, width)
struct.pack_into(">i", header_data , 4, height)
struct.pack_into(">i", header_data , 8, size)
client.sendall(header_data .raw)
client.sendall(coded.tobytes())
except Exception as ex:
print "ERROR:", ex
client.close()
sck.close()
exit()
更新 :通過初始化VideoCapture對象后添加以下代碼行,我可以使它工作得更好,而且效果更好:
cap[0].set(cv2.CAP_PROP_FPS, 15)
cap[1].set(cv2.CAP_PROP_FPS, 15)
這既降低了所需的帶寬,又降低了openCV的工作量。 每隔幾幀我仍然會收到那些可怕的文物,因此,如果有人對此有所建議,我很高興聽到。
好吧,在花費大約5個小時與之抗爭之后,我似乎已經找到了解決方案。
首先,即使我無法以30 FPS的速度拉幀,顯然OpenCV還是試圖以30 FPS的速度捕獲。 我將VideoCapture的幀速率更改為15 FPS,並且視頻變得更加流暢和快速。
cap[0].set(cv2.CAP_PROP_FPS, 15.0)
cap[1].set(cv2.CAP_PROP_FPS, 15.0)
但是,這並沒有消除工件。 最終,我發現如果通過網絡發送圖像后再執行del(im)
,則工件完全消失了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.