2015-03-19 62 views
3

我對使用立體相機計算視頻/圖像深度感興趣。該相機是來自Leopard Imaging https://www.leopardimaging.com/LI-USB30-V024STEREO.html的USB 3.0立體相機。我使用MAC OS X btw。如何計算USB 3.0立體相機的深度信息?

我的客戶支持人員告訴我這是一臺「UVC」照相機。當連接到蘋果電腦時,它會呈現綠色的圖像。

我的最終目標是使用OpenCV的搶左,右幀由兩個鏡片,這樣我可以計算深度。我熟悉OpenCV,但不熟悉立體相機的使用。任何幫助將非常感激。到目前爲止,我已經在Python 3已經這樣做:

import numpy as np 
import cv2 
import sys 
from matplotlib import pyplot as plt 

import pdb; pdb.set_trace() 
print("Camera 1 capture", file=sys.stderr) 
cap = cv2.VideoCapture(1) 

print("Entering while", file=sys.stderr) 
while(True): 
    _ = cap.grab() 
    retVal, frame = cap.retrieve() 

    #gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 

    cv2.imshow('frame', frame) 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 

cap.release() 
cv2.destroyAllWindows() 

這工作,但它只是給了我一個綠色的圖像/影像,沒有深度。有關如何從相機獲取左右兩側畫面的建議?

+0

你得到的可能只是紅外圖像。要檢索立體幀,你需要openni的幫助,默認情況下它並不是內置的(檢查:'cv2.getBuildInformation()'),所以你需要openni sdk,並從src編譯opencv。 – berak 2015-03-19 08:29:14

回答

2

我追逐同樣的問題,但與C/C + +。我已聯繫Leopard,正在等待答案。我的理解是,兩個灰度相機交錯成一個單一的圖像(我認爲OpenCV認爲這是一個彩色圖像,因此奇怪的顏色和失焦)。您需要將字節拆分成兩個單獨的幀。我正在試驗,試圖找出字節放置,但沒有太多。如果你知道這一點,請讓我知道!

他們對Windows示例這裏C#: https://www.dropbox.com/sh/49cpwx0s70fuich/2e0_mFTJY_

不幸的是它使用自己的音樂庫(不是源)做繁重,所以我無法弄清楚自己在做什麼。

2

我遇到了同樣的問題,並最終到達解決方案。但我不知道OpenCV是否可以直接處理它,特別是在Python中。

正如jordanthompson所說,這兩幅圖像是交錯成一幅的。您收到的圖像在YUYV(Y是光強度,UV包含顏色信息)。每個像素都用16位編碼,8位用於Y,8位用於U或V,具體取決於您正在查看的像素。

這裏,Y位來自左側圖像,右側圖像來自UV位。但是當OpenCV接收到這個圖像時,它會將它轉換爲RGB,然後將這兩個圖像完全混合。我無法在Python中找到告訴OpenCV獲取圖像而不轉換它的方法...因此,我們需要在讀取圖像之前OpenCV的。在添加了兩個小函數來執行正確的轉換之後,我設法使用libuvc(https://github.com/ktossell/libuvc)來完成此操作。我猜你可以使用這個庫,如果你可以在C++而不是Python中使用openCV。如果你真的必須堅持使用Python,那麼我沒有一個完整的解決方案,但至少現在你知道要尋找什麼:嘗試直接在YUYV中讀取圖像,然後將這些位分成左和右圖像(你將獲得兩個灰度圖像)。

祝你好運!

+0

太好了。有一段時間我沒有看過這篇文章。我得出了同樣的結論,但爲了準備參加博士學位考試,我停止了這個工作。你可以參考我使用libuvc使用/編寫的函數嗎?也許在gist/github上? – nmante 2015-08-26 02:04:14

+1

當然!這裏是我對libuvc所做的pull請求,我添加的功能是 https://github.com/ktossell/libuvc/pull/27 – 2015-08-26 08:52:13

+0

很好。我將在今天晚些時候查看pull請求。如果一切看起來不錯,我會繼續並接受你的答案! – nmante 2015-08-27 15:36:51

5

豹成像人給我一個線索,但我無法取得進展,因爲我猜我的核心文件中有一些缺失的文件。不過,我認爲這可能有助於某人。所以我把它作爲答案發布。 該消息是由我通過郵件聯繫的一位豹成像人員發送的。它就像這樣.....

我們有一位客戶在一年前成功分離了Linux操作系統上的兩個視頻。我試圖聯繫他,看看他是否可以與我們分享源代碼。不幸的是,他已經離開了這家前任公司,但他仍然發現了一些註釋(如下)。希望能幫助到你。

該攝像機將來自兩個傳感器的圖像合併爲一個16位像素數據(一個攝像機的高8位,另一個攝像機的低8位)。 在Linux OpenCV的解決這個問題,應該跳過通過顏色變換的OpenCV:在

modules/videoio/src/cap_v4l.cpp static IplImage* icvRetrieveFrameCAM_V4L(CvCaptureCAM_V4L* capture, int) 

case V4L2_PIX_FMT_YUYV: 
#if 1 
    /* 
    skip color convert. Just copy image buffer to frame.imageData 
    */ 
    memcpy(capture->frame.imageData, capture->buffers[capture->bufferIndex].start, capture->buffers[capture->bufferIndex].length); 
#else 
    yuyv_to_rgb24(capture->form.fmt.pix.width, capture->form.fmt.pix.height,(unsigned char*) capture->buffers[capture->bufferIndex].start), 
      (unsigned char*)capture->frame.imageData); 
#endif 

希望這有助於。