带GigE Vision相机的OpenCV

时间:2010-07-27 15:53:23

标签: opencv camera

我需要将OpenCV与GigE Vision以太网相机一起使用,但我找不到有关如何执行此操作的任何有用信息,任何指针,文档和示例代码?

我需要从相机中读取帧。

4 个答案:

答案 0 :(得分:20)

Gig-E是各种相机的通信标准。 OpenCV现在包含基于Prosilica Gig-E的摄像头的包装器(参见CV_CAP_PVAPI)

但总的来说,最好使用相机的原生API来获取数据,然后使用openCV将返回的数据转换为图像,openCv包含许多Bayer模式 - > RGB例程。

CvCapture模块便于测试,因为它可以从相机或文件中无缝读取 - 但它并不适合高速实时视觉

答案 1 :(得分:9)

你可以这样做!我使用了Baumer GAPI SDK,这是一个GenTL消费者。 GenTL是一个通用传输层,是genIcam中的一个模块。您可以阅读GenTL HERE。使用像Baumer的GAPI或Basler API这样的GenTL消费者可以让事情变得更容易。它们应该适用于任何GigE相机。

我在另一个答案HERE中采用了更全面的方式来使用堡盟的GAPI SDK,因此我将总结您需要的内容。

  1. Visual Studios
  2. openCV 3 for C ++(HERE是关于如何使用的youtube教程)
  3. 堡盟GAPI SDK HERE
  4. (可选)使用堡盟的Camera Explorer程序测试您的相机和网络接口卡。您需要启用巨型数据包。您可能还需要使用堡盟的IPconfig程序配置摄像头和车载IP地址。
  5. 设置系统变量。请参阅Baumer GAPI SDK docs文件夹中的程序员指南(应该在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个图像。
  9. 将这些#include语句添加到.cpp源文件的顶部:

    #include <opencv2\core\core.hpp 
    #include <opencv2\highgui\highgui.hpp> 
    #include <opencv2\video\video.hpp>
    

    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

答案 2 :(得分:4)

我使用带有OpenCV的uEye GigE相机(5240)。它可以作为cv :: VideoCapture开箱即用。然而,使用API​​可以更好地控制摄像机参数。

答案 3 :(得分:3)

您没有提及相机和平台的类型。在Windows上,根据OpenCV文档:

  

目前有两个相机接口可以   用于Windows:Video for Windows   (VFW)和Matrox成像库(MIL)

您的GigE相机驱动程序不太可能支持VFW,而对于MIL,您需要MIL库,这不是免费的AFAIK。

大多数GigE相机都有一个可用于捕捉图像的API。在大多数情况下,API将基于GenICam。可能你最好的方法是使用相机附带的API,然后将捕获的图像转换为IplImage结构(C)或Mat类(C ++)。