gpt4 book ai didi

c++ - 如何获取 EVF LiveView 图像的尺寸和格式?

转载 作者:行者123 更新时间:2023-11-28 05:31:29 36 4
gpt4 key购买 nike

首先,让我发布一些我通过 Google 发现的类似 SO 问题的链接。第一个链接似乎确实有一个有效的答案,但它并没有直接解决我的问题。第二个链接确实直接解决了我的问题,但 gdh 的回复似乎对我没有帮助。

Canon LiveView: image convertion to OpenCV Mat

Canon EDSDK How can I get width and height of live view images?

我正在尝试使用佳能的 EDSDK 在实时取景模式下从我的 Canon Rebel 下载图像。我能够打开流并连续下载数据流,但我感到困惑的是如何将该数据转换为可用图像。最终我的目标是通过 glTexSubImage2D 将实时取景图像直接上传到 OpenGL 纹理中,但我不清楚如何获取图像位深度、颜色格式和尺寸。

请允许我发布一些示例代码;请记住,这是我的工作代码的精简示例 - 我省略了一些细节,例如启动流、获取相机引用或释放任何引用,实际上下载和 OpenGL 调用发生在不同的线程上。

// All my variables
EdsStreamRef evfStream = nullptr; // evf datastream
EdsImageRef evfImg = nullptr; // image ref
EdsCameraRef camRef = nullptr; // camera ref
void * pData = nullptr; // Pointer to image data
EdsUInt64 uLength( 0 ); // Size in bytes of image data
GLuint uGLTexID( 0 ); // Handle to OpenGL texture
EdsSize imgSize{0}; // Width, height of image
GLuint uClrFmt = GL_RGB; // Color format of image
GLuint uClrType = GL_UNSIGNED_BYTE; // Color data type of image

//////////////////////////////////////////////////////////////////////
// Get image from camera

// Create memory stream, init size to 1 byte for now
EdsCreateMemoryStream( 1, &evfStream );

// Create an image ref from the streawm
EdsCreateEvfImageRef( evfStream, &evfImg );

// Download the image (which I believe resizes the stream)
EdsDownloadEvfImage( camRef, evfImg );

// Get data size and pointer
EdsGetLength( evfStream, &uLength );
EdsGetPointer( evfStream, &pData );

//////////////////////////////////////////////////////////////////////
// Get image info

// This doesn't seem to be correct, using these dimensions causes a crash
EdsGetPropertyData( m_WriteImg.imgRef, kEdsPropID_Evf_CoordinateSystem, 0, sizeof( EdsSize ), &imgSize );

// How do I get these two?
uClrFmt = GL_RGB;
uClrType = GL_UNSIGNED_BYTE;

//////////////////////////////////////////////////////////////////////
// Upload to GPU

// If this is the first time, create the texture
bool bFirstTime = true;
if ( bFirstTime )
{
//Generate the device texture and bind it
glGenTextures( 1, &uGLTexID );
glBindTexture( GL_TEXTURE_2D, uGLTexID );

//Upload host texture to device
glTexImage2D( GL_TEXTURE_2D, 0, uClrFmt, imgSize.width, imgSize.height, 0, uClrFmt, uClrType, pData );

// Unbind
glBindTexture( GL_TEXTURE_2D, 0 );

bFirstTime = false;
}
// Otherwise update the existing texture
else
{
// Bind texture
glBindTexture( GL_TEXTURE_2D, uGLTexID );

// Upload image
glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, imgSize.width, imgSize.height, uClrType, uClrFmt, pData );

// Unbind
glBindTexture( GL_TEXTURE_2D, 0 );
}

缺少的部分是如何获取实际图像及其属性。 EDSDK 示例以及 OpenCV 相关问题确实提供了如何将该数据转换为可用图像的示例,但两者都涉及使用另一个库将数据放入可用图像中。

在EDSDK的例子中,GDI+被用来创建一个CImage对象。我可以在调试器中看到创建的 CImage 的位深度为 24,尺寸为 1056x704(或类似尺寸),但我不知道如何检索数据。

最让我困惑的是 uLength 变量,它是数据流的字节大小,并没有保持不变(它似乎每次都有相对较小的变化。)如果实际图像大小似乎保持不变?

无论如何,我们将不胜感激。我可以尝试使用基于库的解决方案,但我正在努力保持尽可能低的延迟。如果我可以提供更多信息,或者如果您想查看我的实际代码(以防出现问题),请告诉我。

谢谢,

约翰

最佳答案

据我所知,没有获取实时取景大小的功能,也没有必要。您下载的实时取景框是标准的 jpg,因此您可以通过阅读其标题来了解尺寸。我不知道 OpenCV 或 OpenGL 如何处理 jpg 图像,但我确信如果它们支持读取该格式,则有一些功能。否则,您可以使用众多 jpg 库之一。jpg 压缩也解释了为什么帧之间的图像大小不同。

通过使用 kEdsPropID_Evf_CoordinateSystem 调用 EdsGetPropertyData,您实际得到的是实时 View 坐标系大小。这绝对不是实时取景尺寸。我认为它更接近于照片尺寸,但我对此并不完全确定。

关于c++ - 如何获取 EVF LiveView 图像的尺寸和格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39428401/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com