佳能实时显示:图像转换为OpenCV Mat

时间:2014-09-10 05:37:49

标签: c++ qt opencv edsdk

我试图实时显示LiveView图像。我在Windows下使用EDSDK 2.14 + Qt5 + opencv + mingw32。我在图像处理方面不是很复杂,所以现在我遇到了以下问题。我使用佳能EDSDK的例子,直到这部分代码都没问题

// // Display image //

我搜索了很多例子,但所有这些例子都是用C#或MFC或VB编写的。我还建议使用libjpegTurbo解压缩图像,然后使用opencv显示它。我试图使用libjpegTurbo但未能找不到该做什么:(。也许这里有人将转换LiveView流的代码示例转换为opencv Mat或QImage(因为我使用Qt)?

5 个答案:

答案 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)

这取决于liveview-stream的格式。

必须有某种分隔符,然后你需要转换每个图像并用它来更新你的QImage。

查看本教程以获取更多信息:Canon EDSDK Tutorial in C#

答案 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);  
        }
    }
}