Qt 使用 canon edsdk 实现实时预览的示例代码
概述
想要使用canon的sdk进行实时的一个预览,即LiveView功能。
前期准备
前期的一些相机的连接,可以参考我之前写的文章QT使用canonsdk拍照并保存到本机
实时预览步骤
StartLiveView
声明一个变量来标志m_isLiveView来标识liveview是否开启。
将实时预览输出到PC上
device|=kEdsEvfOutputDevice_PC;
//-----------------------------
voidMainWindow::StartLiveView()
{
//Changesettingsbecauseliveviewcannotbestarted
//whencamerasettingsaresetto"donotperformliveview."
//开启
EdsErrorerr=EDS_ERR_OK;
uintevfMode=1;
//把1写入enable
err=EdsSetPropertyData(m_camera,kEdsPropID_Evf_Mode,1,sizeof(uint),&evfMode);
m_isLiveView=true;
//Gettheoutputdevicefortheliveviewimage
EdsUInt32device;
err=EdsGetPropertyData(m_camera,kEdsPropID_Evf_OutputDevice,0,sizeof(device),&device);
if(err==EDS_ERR_OK)
{
device|=kEdsEvfOutputDevice_PC;
err=EdsSetPropertyData(m_camera,kEdsPropID_Evf_OutputDevice,0,sizeof(device),&device);
}
}
将预览的图像流转为QImage再转为Mat
QImageimg=QImage::fromData(data,length,"JPG");
将图像流转为QImage格式,这个是最重要的,在网上搜索了非常久,不知道怎么利用data和length,网上的很多都是用vb和c#处理的,没有C++的。
//------------------------------------
boolMainWindow::requestLiveViewImage()
{
EdsErrorerror=EDS_ERR_OK;
EdsStreamRefstream=NULL;
EdsEvfImageRefevfImage=NULL;
EdsUInt64length;
if(!m_isLiveView)
{
error=EDS_ERR_INTERNAL_ERROR;
qDebug()<<"liveViewfalse";
returnfalse;
}
//在主机计算机的内存中创建流。如果写入超出分配的缓冲区大小,则会自动扩展内存。
error=EdsCreateMemoryStream(0,&stream);
if(error!=EDS_ERR_OK)
{
qDebug()<<("failedtocreatememorystream");
returnfalse;
}
//创建一个用于获取实时取景图像数据集的对象。
error=EdsCreateEvfImageRef(stream,&evfImage);
if(error!=EDS_ERR_OK)
{
qDebug()<<("failedtocreateEvfimage");
returnfalse;
}
//下载当前处于实时取景模式的相机的实时取景图像数据集。
error=EdsDownloadEvfImage(m_camera,evfImage);
if(error!=EDS_ERR_OK)
{
//当相机未准备好图像数据集或无法获取图像数据集时
if(error==EDS_ERR_OBJECT_NOTREADY)
{
qDebug()<<("failedtodownloadEvfimage,notreadyyet");
}
else
{
qDebug()<<("failedtodownloadEvfimage");
}
returnfalse;
}
//获取图像流的大小
error=EdsGetLength(stream,&length);
if(error!=EDS_ERR_OK)
{
qDebug()<<("failedtogetEvfimagelength");
returnfalse;
}
if(length==0)
{
qDebug()<<("failedtogetEvflengthiszero");
returnfalse;
}
//获取图像流的指针
unsignedchar*data=NULL;
error=EdsGetPointer(stream,(EdsVoid**)&data);
if(error!=EDS_ERR_OK)
{
qDebug()<<("failedtogetpointerfromstream");
returnfalse;
}
//将图像流转为QImage
QImageimg=QImage::fromData(data,length,"JPG");
//将QImage转为Mat格式
m_image=QImageToMat(img);
//释放
if(stream!=NULL)
{
EdsRelease(stream);
stream=NULL;
}
if(evfImage!=NULL)
{
EdsRelease(evfImage);
evfImage=NULL;
}
returntrue;
}
//-----------------------------------------
cv::MatMainWindow::QImageToMat(QImage&src)
{
//注意这个CV_8UC4和你相机拍到的图像格式有关系,如果不符合,图像会损坏,显示出来就有问题
cv::Mattmp(src.height(),src.width(),CV_8UC4,(uchar*)src.bits(),src.bytesPerLine());
cv::Matresult=tmp.clone();//深拷贝
returnresult;
}
在Qt中用OpenCv中显示
//-------------------------
voidMainWindow::ShowVideo()
{
namedWindow("yunhu",WINDOW_NORMAL);
while(1)
{
requestLiveViewImage();
//m_image就是转换生成的Mat
if(m_image.data!=NULL)
{
imshow("yunhu",m_image);
cvWaitKey(50);
}
}
}
参考资料
QT使用canonsdk拍照并保存到本机-云胡
EDSDK_API3.4
到此这篇关于Qt使用canonedsdk实现实时预览的文章就介绍到这了,更多相关Qt使用canonedsdk实现实时预览内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!