映美精相机的数据流转成MAT

       由于项目需要,采用映美精的工业相机,利用其图像进行实时采集,并且将图像数据导入成Opencv的Mat图像格式,进行进一步处理。

       这个过程涉及到三个方面:

  1. 映美精相机的采集,
  2. 采集得到的图像与Mat格式的转换,
  3. Mat格式如何在图像控件中显示

       首先在其官方网站下载相机的驱动以及其开发工具包IC Imaging Control .NET Component, C++ Class Library。下载后安装好,我们可以看到其例子,其中有classlib文件夹,里面的文件就是我们需要使用的文件。然后我们就是根据其例程进行修改。

#include "opencv2/opencv.hpp"

#include "tisudshl.h"

#include "CmdHelper.h"//这两个头文件是需要包含的,这样才能进行文件的生成

using namespace cv;

using namespace _DSHOWLIB_NAMESPACE;

int main()

{

    Mat capframe; //得到的图像

    IplImage* rawImage; //旧版的图像

    Grabber grabber;

    tFrameHandlerSinkPtr pSink;

    BYTE* pBuf[1];

    FrameTypeInfo info;

    tMemBufferCollectionPtr pCollection;

    int Height;

    int Width;

    // 图像的类型

    int captype;

    // 图像的通道

    int capchannels;

    //以下就是相机的初始化

    DShowLib::InitLibrary();

    BOOL CameraExist=PathFileExists(L"lastSelectedDeviceState.xml");

    if (!CameraExist)

    {

        setupDeviceFromFile(grabber);

    }

    if (grabber.getAvailableVideoCaptureDevices()==0)

    {

        return false;

    }



    grabber.loadDeviceStateFromFile("lastSelectedDeviceState.xml");

    //    grabber.saveDeviceStateToFile("lastSelectedDeviceState.xml");

    grabber.setOverlayBitmapPathPosition( ePP_NONE );

    pSink = FrameHandlerSink::create( eY800, 1 );



    pSink->setSnapMode( true );



    // Set the sink.

    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 false;

    }

    pSink->getOutputFrameType( info );

    pBuf[0] = new BYTE[info.buffersize];

    pCollection = MemBufferCollection::create( info, 1, pBuf );

    if( pCollection == 0 || !pSink->setMemBufferCollection( pCollection ) )

    {

        std::cerr << "Could not set the new MemBufferCollection, because types do not match.";

        return false;

    }

    grabber.startLive( false );

    rawImage = cvCreateImage(cvSize(2592,1944),IPL_DEPTH_8U,1);

    rawImage->widthStep=2592;

    rawImage->imageData=(char*)pBuf[0];

    capframe.create(1944,2592,CV_8U);

    Height=2592;

    Width=1944;

    captype=CV_8U;

    capchannels=1;

    //初始化完毕,下面开始获取一副图像

    pSink->snapImages(1);

    capframe.data=(uchar*)rawImage->imageData;

    //Mat::Mat(rawImage).copyTo(capframe);

    return 1;

}

原文地址:http://www.xncae.com/html/120.html

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值