打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
如何利用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.xncae.com/html/120.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
OpenCV读取图像显示在MFC窗口上
利用MFC中的picture control 控件显示图像 opencv
MFC:CImage显示OpenCV:Mat矩阵图像
OpenCV+MFC显示图像/视频
关于MFC的Picture控件
数字图像处理初学者学习路线
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服