簡體   English   中英

Raspberry Pi 3上的OpenCV多個USB攝像頭

[英]OpenCV multiple USB camera on Raspberry Pi 3

我之前看過很多與此相關的問題,但都無濟於事。

我的設置:

  • 其中的這些
    • 它們顯示為/dev/video0/dev/video1
    • 圖片為640 x 480
  • 樹莓派3
  • 覆盆子傑西
  • OpenCV 3.1.0
  • Python 2.7

對於這兩個攝像機中的任何一個,我都可以捕獲圖像並以相當不錯的速率顯示它們,並且延遲最小(偶爾出現偽像)。

但是,當我嘗試同時使用兩者時, 可能會得到十分之一的幀速率(盡管幀之間的延遲似乎隨每個幀而變化),並帶有各種令人討厭的圖像偽影(例如,參見下文),並且出現了無法忍受的延遲。

文物

問題似乎在於相機本身或設備上的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM