创建映美相机缓冲区,根据自己的实际需求得到缓冲区中的图片

上一篇博客提到了怎么加载映美相机,我的映美相机库是3.4版本的。

上一篇博客的链接:https://blog.csdn.net/qq_35159351/article/details/84473224

我发现映美提供了一个例子写的不错:

  • xxx\IC Imaging Control 3.4\samples\vc10\MembufferCollection

例子如下:

#include "tisudshl.h"
#include 
#include "cmdhelper.h"
using namesoace DShowLib;


//省略一些不必要的代码
    // Initialize the library.
    DShowLib::InitLibrary();
    //创建Grabber对象
    Grabber grabber;
    if( !setupDeviceFromFile( grabber ) )//这个会弹出一个相机设置对话框,厂家自己写的
    {
        return -1;
    }
    //设置叠加位图的位置,这个我现在也不知道原理,大家来讨论啊
    grabber.setOverlayBitmapPathPosition( ePP_NONE );

    // Set the image buffer format to eY800. eY800 means monochrome, 8 bits (1 byte) per                              
    //pixel.
    // Let the sink create a matching MemBufferCollection with 1 buffer.
    //让接收器创建一个带有一个缓冲区的匹配内存缓冲区集合,并且设置图片的缓冲区格式是eY800,eY800
    //表示单色,8位(一个字节)一个像素。
    tFrameHandlerSinkPtr pSink = FrameHandlerSink::create( eY800, 1 );

    // We use snap mode.
    //使用快照模式
    pSink->setSnapMode( true );

    // Set the sink.
    //grabber设置快照类型
    grabber.setSinkType( pSink );    

    //准备实时模式,获取接收器输出大小
    // Prepare the live mode, to get the output size if the sink.
    if( !grabber.prepareLive( false ) )
    {
        std::cerr << "Could not render the VideoFormat into a eY800 sink.";
        return -1;
    }

    // Retrieve the output type and dimension of the handler sink.
    // The dimension of the sink could be different from the VideoFormat, when
    // you use filters.
    FrameTypeInfo info;//帧类型信息
    pSink->getOutputFrameType( info );//检索程序输出类型和纬度,为下面的申请缓冲区大小做准备

    BYTE* pBuf[5];//创建一个uchar*类型的指针数组
    // Allocate 5 image buffers of the above calculate buffer size.
    for( int i = 0; i < 5; ++i )//5张图像的缓冲区
    {
        pBuf[i] = new BYTE[info.buffersize];//初始化数组中每个下标对应元素的大小
    }

    // Create a new MemBuffer collection that uses our own image buffers.
    //用我们自己的图像缓冲区创建一个新的缓冲区集合
    tMemBufferCollectionPtr pCollection = MemBufferCollection::create( info, 5, pBuf );
    //对接收器设置缓冲区集合
    if( pCollection == 0 || !pSink->setMemBufferCollection( pCollection ) )
    {
        std::cerr << "Could not set the new MemBufferCollection, because types do not match.";
        return -1;
    }

    // Start live mode for fast snapping. The live video will not be displayed,
    // because false is passed to startLive().
    grabber.startLive( false );//为快照开始实时模式,不显示实时视频,把false改成true就显示实时视频了
    
    // Snap 5 images. The images are copied to the MemBufferCollection the
    // application created above.
    //快速抓取5张图,图像复制到应用程序创建的内存缓冲区集合
    //下面都是关闭资源回收的操作了
    pSink->snapImages( 5 );
    // Stop the live video.
    grabber.stopLive();//抓完图了就可以停止实时模式了
    
    // Close the device.
    grabber.closeDev();

    // Save the five captured images in the MemBuffer collection to separate files.
    pCollection->save( "file*.bmp" );//保存在当前目录下,五张图片

    // Free the five buffers in the MemBuffer collection.
    for( int j = 0; j < 5; ++j )
    {
        delete pBuf[j];
    }

    return 0;

 

 

以上就是这个例子的介绍了,下一篇我开始介绍怎么用opencv播放视频

你可能感兴趣的:(C++,Windows,工业相机,Video)