2010-07-27 432 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