我已经对USB网络摄像头进行了编程,其唯一目的是从摄像头获取实时帧并显示在窗口中。为此,我使用了cvCaptureFromCAM,它对于USB摄像头效果很好(请参见下面的代码)。
我想知道如何从千兆位以太网摄像机捕获帧?我想我需要使用一些API从某些默认IP地址捕获帧。有人可以指出我正确的方向吗?
我将在Intel i3处理器的Windows 7上将C++与OpenCV一起使用。
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
// A Simple Camera Capture Framework
int main() {
CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY );
if ( !capture ) {
fprintf( stderr, "ERROR: capture is NULL \n" );
getchar();
return -1;
}
// Create a window in which the captured images will be presented
cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE );
// Show the image captured from the camera in the window and repeat
while ( 1 ) {
// Get one frame
IplImage* frame = cvQueryFrame( capture );
if ( !frame ) {
fprintf( stderr, "ERROR: frame is null...\n" );
getchar();
break;
}
cvShowImage( "mywindow", frame );
// Do not release the frame!
// If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
// remove higher bits using AND operator
if ( (cvWaitKey(10) & 255) == 27 ) break;
}
// Release the capture device housekeeping
cvReleaseCapture( &capture );
cvDestroyWindow( "mywindow" );
return 0;
}
更新
因此,现在我可以在供应商提供的软件GUI中显示实时图像。但是我仍然想使用摄像机的IP地址显示图像(可能还有视频)。
当我知道摄像机的IP地址时,为什么不能访问摄像机发送并在浏览器中显示的数据(图像)?我尝试在浏览器(192.169.2.4)上输入摄像机的ip地址(即192.169.2.3),但显示“找不到页面”。这是什么意思?
最佳答案
您可以使用genIcam API来执行此操作。 genIcam是相机的通用接口(interface)(USB,GigE,CameraLink等)。它由多个模块组成,但我们将重点介绍GenTL(传输层)。您可以阅读有关GenTL文档HERE的更多信息。我建议使用Basler API或Baumer API,它们是GenTL使用者(生产者和使用者在GenTL文档中进行了描述)。我使用了堡盟API,但两者都可以使用。
注意:我正在使用堡盟HXG20单声道。
要下载和安装的内容
使用相机探索器测试相机
最好在Camera Explorer程序中验证您的网络接口(interface)卡(NIC)和相机是否正常运行。您可能需要在NIC上启用巨型数据包。您也可以使用IPconfig程序(DHCP或静态IP)配置摄像机IP。
设置视觉工作室
《 Baumer GAPI SDK程序员指南》(第4章)中介绍了设置环境变量和配置Visual Studio的步骤,该指南位于以下目录中
C:\Program Files\Baumer\Baumer GAPI SDK\Docs\Programmers_Guide
GENICAM_GENTL64_PATH
C:\Program Files\Baumer\Baumer GAPI SDK\Components\Bin\x64\
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窗口中显示图像流
最简单的入门方法是使用堡盟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
语句,用于检查Pixel格式是“单声道”(灰度)还是彩色。在原始文件中,它从619行开始,到692结尾。在if
和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窗口来显示摄像机图像!
表示赞许,满意,胜利!!!!
关于c++ - OpenCV:如何从以太网摄像机捕获帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11009452/