您可以使用 genIcam API 来完成此操作。 genIcam 是相机的通用接口(USB、GigE、CameraLink 等)。它由多个模块组成,但我们将重点关注 GenTL(传输层)。您可以阅读有关 GenTL 文档的更多信息HERE。我建议使用 Basler API 或 Baumer API,它们是 GenTL 消费者(生产者和消费者在 GenTL 文档中进行了描述)。我使用了 Baumer API,但两者都应该可以工作。
注意:我使用的是 Baumer HXG20 mono。
下载和安装的东西
- Visual Studio社区版(我用的是2015LINK)
- 堡盟GAPI SDK,LINK
- openCV(这里是为 c++ 构建 openCV 3 的 youtube 教程)HERE
使用相机浏览器测试相机
最好在 Camera Explorer 程序中验证您的网络接口卡 (NIC) 和相机是否正常工作和运行。您可能需要在 NIC 上启用巨型数据包。您也可以使用 IPconfig 程序配置摄像机 IP(DHCP 或静态 IP)。
设置视觉工作室
Baumer GAPI SDK 程序员指南(第 4 章)中描述了设置环境变量和配置 Visual Studio,位于以下目录
C:\Program Files\Baumer\Baumer GAPI SDK\Docs\Programmers_Guide
-
检查您是否具有以下系统变量(如果使用 64 位版本),或者根据需要创建该变量(请参阅程序员指南中的第 4.3.1 节)。
-
name = GENICAM_GENTL64_PATH
-
value = C:\Program Files\Baumer\Baumer GAPI SDK\Components\Bin\x64\
-
在 Visual Studio 中,创建一个新的 C++ 项目并更新以下属性(请参阅程序员指南中的第 4.4.1 节)。
-
C/C++ > 常规 > 其他包含目录 =C:\Program Files\Baumer\Baumer GAPI SDK\Components\Dev\C++\Inc
-
链接器 > 常规 > 其他库目录 =C:\Program Files\Baumer\Baumer GAPI SDK\Components\Dev\C++\Lib\x64
-
链接器 > 输入 > 附加依赖项 =bgapi2_genicam.lib
-
构建事件 > 构建后事件 > 命令行 =copy "C:\Program Files\Baumer\Baumer GAPI SDK\Components\Bin\x64"\*.* .\
创建 .CPP 文件以在 OPENCV 窗口中显示图像流
最简单的入门方法是使用 Baumer GAPI SDK 中提供的示例代码之一并对其进行修改以添加 openCV 功能。要使用的示例代码是 005_PixelTransformation,位于此处
C:\Program Files\Baumer\Baumer GAPI SDK\Components\Examples\C++\src\0_Common\005_PixelTransformation
将此 .cpp 文件复制并粘贴到项目源目录中,并确保可以构建和编译。它应该捕获 8 个图像,并打印出每个图像前 6 行的前 6 个像素值。
添加这些#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 (frame width x height)
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
检查像素格式是“单色”(灰度)还是彩色的语句。在原始文件中,它从第 619 行开始,到第 692 行结束。if
and else
语句大括号是闭合的,并且在之前pImage->Release();
声明中,我们需要添加 openCV 部分以将图像显示到窗口。添加以下代码行
} // This is the closing brace for the 'else color' statement
// 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
目的。我的相机是单色 8 位,所以我需要指定CV_8U
。如果您的相机是 RGB 或 10 位像素,则需要提供正确的格式(请参阅 openCV 文档HERE).
您可以参考其他示例调整相机参数。
现在,一旦构建和编译,您应该会打开一个显示相机图像的 openCV 窗口!
竖起大拇指!!!!