分享

如何利用OpenCV抓取映美精相机的实时图像并且显示在MFC的控件中

 正则室 2017-07-24

如何利用OpenCV抓取映美精相机的实时图像并且显示在MFC的控件中

(2016-03-15 22:31:27)
标签: 

opencv

分类: Opencv学习
由于项目需要,采用映美精的工业相机。而采用映美精的相机需要把图像进行实时采集,并且将图像数据导入到Opencv的Mat图像格式中进行进一步处理,而且需要在图像控件中将其显示出来。因此涉及到三个方面,1映美精相机的采集,2采集得到的图像与Mat格式的转换,3Mat格式如何在图像控件中显示。首先我们先在在其官方网站下载相机的驱动以及其开发工具包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;
}
但是只是获取一副图像还不够,还要在MFC的控件中显示出来。因此我们需要先下载CvvImage.h和.cpp文件,然后在添加如下代码就可以实现显示
    CDC *pDC = GetDlgItem(IDC_STATIC)->GetDC();
    HDC hDC= pDC->GetSafeHdc();
    CRect rect;
    GetDlgItem(IDC_STATIC)->GetClientRect(&rect);
    CvvImage cimg;
    cimg.CopyOf(&IplImage(img));
    cimg.DrawToHDC(hDC,&rect);
    ReleaseDC(pDC);
这样就能满足我们的需求了。
原文地址:http://www./html/120.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多