我需要在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