带GigE Vision相机的OpenCV

Mat*_*gro 31 camera opencv

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

我需要从相机读取帧.

Mar*_*ett 20

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

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

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


mar*_*jay 9

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

我在这里用另一个答案做了一个更全面的方式来使用堡盟的GAPI SDK ,所以我将总结你需要什么.

  1. 视觉工作室
  2. openCV 3 for C++(HERE是关于如何使用的youtube教程)
  3. 堡盟GAPI SDK在这里
  4. (可选)使用堡盟的Camera 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. 转到examples文件夹并查找005_PixelTransformation示例.它应该在(C:\Program Files\Baumer\Baumer GAPI SDK\Components\Examples\C++\src\0_Common\005_PixelTransformation)中.复制C++文件并将其粘贴到新项目的源目录中.
  8. 验证您可以构建和编译.注意:您可能会发现调整相机参数的部件出现问题(例如曝光时间).对于8个图像,您应该看到前6行中前6个像素写入屏幕的像素值.

将这些#include语句添加到.cpp源文件的顶部:

#include <opencv2\core\core.hpp 
#include <opencv2\highgui\highgui.hpp> 
#include <opencv2\video\video.hpp>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

在原始的005_PixelTransformation.cpp文件中,第569行有一个for循环,循环超过8个图像,这表示for(int i = 0; i < 8; i++).我们想要改变它以持续运行.我通过将其更改为while循环来实现此目的

while (pDataStream->GetIsGrabbing())
Run Code Online (Sandbox Code Playgroud)

在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);
Run Code Online (Sandbox Code Playgroud)

确保为openCvImage对象选择了正确的像素格式.我选择CV_8U是因为我的相机是单声道8位.

在构建和编译时,你应该得到一个openCV窗口,显示你相机的实时信息!

就像我说的那样,可以做到,因为我已经做到了.如果遇到问题,请参阅程序员指南.

在此输入图像描述