我需要在GigE Vision Ethernet Camera上使用OpenCV,但是我找不到有關如何執行此操作,任何指針,文檔和示例代碼的很多有用信息?使用GigE Vision相機的OpenCV
我需要從相機讀取幀。
我需要在GigE Vision Ethernet Camera上使用OpenCV,但是我找不到有關如何執行此操作,任何指針,文檔和示例代碼的很多有用信息?使用GigE Vision相機的OpenCV
我需要從相機讀取幀。
Gig-E是各種相機的通信標準。 OpenCV現在包含基於Prosilica Gig-E的相機的封裝(請參閱CV_CAP_PVAPI)
但是,通常最好使用相機的本機API獲取數據,然後使用openCV將返回的數據轉換爲圖像,openCv包含一個數字拜耳模式 - > RGB例程。
的CvCapture模塊,方便進行測試,因爲它可以無縫地從相機或文件中讀取 - 但它不是真正適合高速實時視覺
您沒有提及相機和平臺的類型。在Windows上,根據OpenCV的文檔:
目前有兩個攝像頭接口可以 在Windows上使用:Windows視頻 (VFW)和Matrox圖像庫(MIL)
這是不可能的您的GigE相機驅動程序支持VFW,而對於MIL,您需要MIL庫,這不是免費的AFAIK。
大多數GigE攝像頭都會有一個可以用來捕捉圖像的API。在大多數情況下,API將基於GenICam。可能您最好的方法是使用相機隨附的API,然後將捕獲的圖像轉換爲IplImage結構(C)或Mat類(C++)。
謝謝,是的,它在Windows上。所以OpenCV需要一個驅動程序與相機進行通信? – 2010-07-29 15:45:24
可能是的。更準確地說,相機可能需要一個驅動程序與Windows進行通信。而且您需要使用相機的API(SDK)從軟件進行通信。我可能說,因爲它取決於特定的相機。 – 2010-07-30 07:49:01
我使用的uEye千兆以太網相機(5240)與OpenCV。它作爲cv :: VideoCapture開箱即用。儘管如此,使用API可以更好地控制攝像機參數。
嗨,我剛剛在Google搜索完這篇文章之後,剛剛登陸這裏瞭解如何使用OpenCV閱讀這個uEye,你能否提供一個快速的代碼片段來說明你如何做到這一點?編輯:你不會碰巧在Linux這樣做,你會嗎? – Chriszuma 2012-10-23 18:56:22
我目前沒有相機。但我記得我所做的:我使用示例代碼從網絡攝像頭獲取圖像。就像'frame = cv :: Mat; cap = cv :: VideoCapture(0); cap.open();框架「帽」。當我忘記連接攝像頭時,OpenCV打開了uEye攝像頭,因爲它是唯一通過GigE連接到PC的攝像頭。很確定我當時正在使用Windows。 – 2012-10-24 08:39:48
所以你不需要指定相機的IP? – user391339 2017-11-20 04:07:40
你可以做到這一點!我使用了堡盟GAPI SDK,這是一個GenTL消費者。 GenTL是一個通用的傳輸層,它是genIcam中的一個模塊。您可以閱讀GenTL HERE。使用像堡盟的GAPI或Basler's API這樣的GenTL消費者可以讓事情變得更容易。他們應該使用任何GigE相機。
我在另一個回答HERE中提出了一個更全面的方法來使用堡盟的GAPI SDK,因此我將對您需要的內容進行總結。
C:\Program Files\Baumer\Baumer GAPI SDK\Docs\Programmers_Guide
中)。參考4.3.1節。C:\Program Files\Baumer\Baumer GAPI SDK\Components\Examples\C++\src\0_Common\005_PixelTransformation
)。複製C++文件並將其粘貼到新項目的源代碼目錄中。這些#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循環有一個if
和else
語句來檢查圖像的像素格式這樣做。在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窗口,它顯示你的相機的實時提要!
就像我說過的,它可以做到,因爲我已經做到了。如果遇到問題,請參閱程序員指南。
感謝您清理堆棧,在GeniCam之上的Basler SDK。 Basler是否在相機驅動程序中實施了GeniCam標準?我猜GeniCam DLL會調用Basler驅動程序來執行幀傳輸。正確? – 2018-02-14 03:43:37
是的Basler遵循GeniCam標準。 – 2018-02-17 23:43:51
專門針對GigE的願景,最好使用Pleora的SDK,儘管不是免費的。一般來說,雖然你推薦原生SDK是正確的。您仍然可以將OpenCV用於捕獲以外的其他位。 – 2015-04-29 07:36:18
看來你們都建議使用原生SDK來使用任何相機。 (@JasonNewton,@MartinBeckett)。這是爲什麼?我可以想象API的性能和功能更好。但是,如果靈活性是目標,我不需要高功率特性? – kdbanman 2015-09-16 22:37:49
@kdbanman您必須定義靈活性 - 使用本機SDK時最好進行設置 - 許多事情沒有辦法通過支持抽象的交叉相機進行設置。另一個是如果它運行正確/強大......通常高級驅動程序不能處理供應商特定api的怪癖。但是,如果您正在使用GigE,則還有另一種選擇 - 比任何其他專有實施更好的Pleora SDK。如果你想要所有其他類別,那就是要使用的庫,而不是OpenCV。有點奇怪,他們沒有爲Allied Visions的IMO添加支持。 – 2015-10-08 00:35:52