我试图实时显示LiveView图像。我在Windows下使用EDSDK 2.14 + Qt5 + opencv + mingw32。我在图像处理方面不是很复杂,所以现在我遇到了以下问题。我使用佳能EDSDK的例子,直到这部分代码都没问题
//
// Display image
//
我搜索了很多例子,但所有这些例子都是用C#或MFC或VB编写的。我还建议使用libjpegTurbo解压缩图像,然后使用opencv显示它。我试图使用libjpegTurbo但未能找不到该做什么:(。也许这里有人将转换LiveView流的代码示例转换为opencv Mat或QImage(因为我使用Qt)?
答案 0 :(得分:4)
按照佳能EDSDK参考中的SAMPLE 10后,这对我有用。这是一个更强大的解决方案的起点。
在downloadEvfData函数中,我用下面的代码替换了“显示图像”部分:
unsigned char *data = NULL;
EdsUInt32 size = 0;
EdsSize coords ;
// get image coordinates
EdsGetPropertyData(evfImage, kEdsPropsID_Evf_CoordinateSystem, 0, sizeof(coords), &coords);
// get buffer pointer and size
EdsGetPointer(stream, (EdsVoid**)&data);
EdsGetLenth(stream, &size);
//
// release stream and evfImage
//
// create mat object
Mat img(coords.height, coords.width, CV_8U, data);
image = imdecode(img, CV_LOAD_IMAGE_COLOR);
我也改变了功能签名:
EdsError downloadEvfData(EdsCameraRef camera, Mat& image)
在主要功能中:
Mat image;
namedWindow("main", WINDOW_NORMAL);
startLiveView(camera);
for(;;) {
dowloadEvfData(camera, image);
imshow("main", image);
if (waitkey(10) >= 0);
break;
}
答案 1 :(得分:2)
根据Canon EDSDKs示例,您可以将具有正确长度的EdsStreamRef“stream”数据附加到QByteArray
。然后,使用例如以下内容将QByteArray中的原始数据作为JPG解析为新的QImage:
QImage my_image = QImage::fromData(limagedata,"JPG");
一旦它出现在QImage中,您就可以将其转换为OpenCV cv :: Mat(参见How to convert QImage to opencv Mat)
答案 2 :(得分:0)
答案 3 :(得分:0)
嗯,我知道如何使用c#,Vb,MFC和ATL转换LiveView流,但我的想法是创建多平台应用程序,所以我选择C ++ + Qt。我不想使用与微软相关的库和编程语言
答案 4 :(得分:0)
QImage img = QImage::fromData(data, length, "JPG");
m_image = QImageToMat(img);
// -----------------------------------------
cv::Mat MainWindow::QImageToMat(QImage& src)
{
cv::Mat tmp(src.height(),src.width(),CV_8UC4,(uchar*)src.bits(),src.bytesPerLine());
cv::Mat result = tmp.clone();
return result;
}
// -------------------------
void MainWindow::ShowVideo()
{
namedWindow("yunhu",WINDOW_NORMAL);
while(1)
{
requestLiveViewImage();
if(m_image.data != NULL)
{
imshow("yunhu", m_image);
cvWaitKey(50);
}
}
}