2010-07-27 388 views

回答

15

Gig-E是各種相機的通信標準。 OpenCV現在包含基於Prosilica Gig-E的相機的封裝(請參閱CV_CAP_PVAPI)

但是,通常最好使用相機的本機API獲取數據,然後使用openCV將返回的數據轉換爲圖像,openCv包含一個數字拜耳模式 - > RGB例程。

的CvCapture模塊,方便進行測試,因爲它可以無縫地從相機或文件中讀取 - 但它不是真正適合高速實時視覺

+1

專門針對GigE的願景,最好使用Pleora的SDK,儘管不是免費的。一般來說,雖然你推薦原生SDK是正確的。您仍然可以將OpenCV用於捕獲以外的其他位。 – 2015-04-29 07:36:18

+0

看來你們都建議使用原生SDK來使用任何相機。 (@JasonNewton,@MartinBeckett)。這是爲什麼?我可以想象API的性能和功能更好。但是,如果靈活性是目標,我不需要高功率特性? – kdbanman 2015-09-16 22:37:49

+1

@kdbanman您必須定義靈活性 - 使用本機SDK時最好進行設置 - 許多事情沒有辦法通過支持抽象的交叉相機進行設置。另一個是如果它運行正確/強大......通常高級驅動程序不能處理供應商特定api的怪癖。但是,如果您正在使用GigE,則還有另一種選擇 - 比任何其他專有實施更好的Pleora SDK。如果你想要所有其他類別,那就是要使用的庫,而不是OpenCV。有點奇怪,他們沒有爲Allied Visions的IMO添加支持。 – 2015-10-08 00:35:52

3

您沒有提及相機和平臺的類型。在Windows上,根據OpenCV的文檔:

目前有兩個攝像頭接口可以 在Windows上使用:Windows視頻 (VFW)和Matrox圖像庫(MIL)

這是不可能的您的GigE相機驅動程序支持VFW,而對於MIL,您需要MIL庫,這不是免費的AFAIK。

大多數GigE攝像頭都會有一個可以用來捕捉圖像的API。在大多數情況下,API將基於GenICam。可能您最好的方法是使用相機隨附的API,然後將捕獲的圖像轉換爲IplImage結構(C)或Mat類(C++)。

+0

謝謝,是的,它在Windows上。所以OpenCV需要一個驅動程序與相機進行通信? – 2010-07-29 15:45:24

+0

可能是的。更準確地說,相機可能需要一個驅動程序與Windows進行通信。而且您需要使用相機的API(SDK)從軟件進行通信。我可能說,因爲它取決於特定的相機。 – 2010-07-30 07:49:01

4

我使用的uEye千兆以太網相機(5240)與OpenCV。它作爲cv :: VideoCapture開箱即用。儘管如此,使用API​​可以更好地控制攝像機參數。

+0

嗨,我剛剛在Google搜索完這篇文章之後,剛剛登陸這裏瞭解如何使用OpenCV閱讀這個uEye,你能否提供一個快速的代碼片段來說明你如何做到這一點?編輯:你不會碰巧在Linux這樣做,你會嗎? – Chriszuma 2012-10-23 18:56:22

+0

我目前沒有相機。但我記得我所做的:我使用示例代碼從網絡攝像頭獲取圖像。就像'frame = cv :: Mat; cap = cv :: VideoCapture(0); cap.open();框架「帽」。當我忘記連接攝像頭時,OpenCV打開了uEye攝像頭,因爲它是唯一通過GigE連接到PC的攝像頭。很確定我當時正在使用Windows。 – 2012-10-24 08:39:48

+0

所以你不需要指定相機的IP? – user391339 2017-11-20 04:07:40

5

你可以做到這一點!我使用了堡盟GAPI SDK,這是一個GenTL消費者。 GenTL是一個通用的傳輸層,它是genIcam中的一個模塊。您可以閱讀GenTL HERE。使用像堡盟的GAPI或Basler's API這樣的GenTL消費者可以讓事情變得更容易。他們應該使用任何GigE相機。

我在另一個回答HERE中提出了一個更全面的方法來使用堡盟的GAPI SDK,因此我將對您需要的內容進行總結。

  1. 視覺工作室
  2. OpenCV的3 C++(HERE是如何在YouTube上的教程)
  3. 堡盟GAPI SDK HERE
  4. (可選)使用堡盟相機Explorer程序測試你的攝像頭和網絡接口卡。您需要啓用巨型數據包。您可能還需要使用堡盟的IPconfig程序配置攝像頭和車載IP地址。
  5. 設置您的系統變量。請參閱堡盟GAPI SDK文檔文件夾中的程序員指南(應位於C:\Program Files\Baumer\Baumer GAPI SDK\Docs\Programmers_Guide中)。參考4.3.1節。
  6. 在Visual Studios中創建一個新的C++項目並配置屬性。請參閱第4.4.1節。
  7. 轉到示例文件夾並查找005_PixelTransformation示例。它應該在(C:\Program Files\Baumer\Baumer GAPI SDK\Components\Examples\C++\src\0_Common\005_PixelTransformation)。複製C++文件並將其粘貼到新項目的源代碼目錄中。
  8. 驗證您可以構建和編譯。注意:您可能會發現調整相機參數的部分存在問題(例如曝光時間)。你應該看到像素值寫入屏幕前6行中的前6個像素,8個圖像。

這些#include語句添加到在.cpp源文件的頂部:

​​

main()功能

// OPENCV VARIABLE DECLARATIONS 
cv::VideoWriter cvVideoCreator;     // Create OpenCV video creator 
cv::Mat openCvImage;       // create an OpenCV image 
cv::String videoFileName = "openCvVideo.avi"; // Define video filename 
cv::Size frameSize = cv::Size(2048, 1088);  // Define video frame size 
cvVideoCreator.open(videoFileName, CV_FOURCC('D', 'I', 'V', 'X'), 20, frameSize, true); // set the codec type and frame rate 

的開頭添加這些變量聲明在原有005_PixelTransformation .cpp文件,第569行有一個for循環,循環顯示8個圖像,其中說明了for(int i = 0; i < 8; i++)。我們想改變這個連續運行。我通過它更改爲while環,上面寫着

while (pDataStream->GetIsGrabbing()) 

在while循環有一個ifelse語句來檢查圖像的像素格式這樣做。在else聲明右括號後和pImage->Release();語句之前,添加下列行

// OPEN CV STUFF 
openCvImage = cv::Mat(pTransformImage->GetHeight(), pTransformImage->GetWidth(), CV_8U, (int *)pTransformImage->GetBuffer()); 

// create OpenCV window ---- 
cv::namedWindow("OpenCV window: Cam", CV_WINDOW_NORMAL); 

//display the current image in the window ---- 
cv::imshow("OpenCV window : Cam", openCvImage); 
cv::waitKey(1); 

確保你選擇了正確的像素格式爲您openCvImage對象。我選擇了CV_8U,因爲我的相機是單聲道8位。

當你建立和編譯時,你應該得到一個openCV窗口,它顯示你的相機的實時提要!

就像我說過的,它可以做到,因爲我已經做到了。如果遇到問題,請參閱程序員指南。

enter image description here

+0

感謝您清理堆棧,在GeniCam之上的Basler SDK。 Basler是否在相機驅動程序中實施了GeniCam標準?我猜GeniCam DLL會調用Basler驅動程序來執行幀傳輸。正確? – 2018-02-14 03:43:37

+0

是的Basler遵循GeniCam標準。 – 2018-02-17 23:43:51