我已经对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单声道。
要下载和安装的内容

  • Visual Studios社区版本(我使用了2015 LINK)
  • Baumer GAPI SDK,LINK
  • openCV(这是一个YouTube教程,用于为c++构建openCV 3)HERE

  • 使用相机探索器测试相机
    最好在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
  • 检查您是否具有以下系统变量(如果使用64位版本),或者根据需要创建变量(请参阅程序员指南中的4.3.1节)。
  • 名称= GENICAM_GENTL64_PATH
  • 值= 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窗口中显示图像流
    最简单的入门方法是使用堡盟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结尾。在ifelse语句大括号关闭之后,以及在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&#43;&#43; - OpenCV:如何从以太网摄像机捕获帧-LMLPHP

    关于c++ - OpenCV:如何从以太网摄像机捕获帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11009452/

    10-11 16:13