[英]How to get dimensions and format of EVF LiveView Image?
首先,讓我發布指向一些通過Google找到的類似SO問題的鏈接。 第一個鏈接似乎有一個有效的答案,但沒有直接解決我的問題。 第二個鏈接確實直接解決了我的問題,但是gdh的回復似乎對我沒有幫助。
我正在嘗試使用佳能的EDSDK在實時顯示模式下從佳能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實際獲得的是實時視圖坐標系大小。 絕對不是實時取景大小。 我認為它更接近照片尺寸,但是我對此並不完全確定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.