簡體   English   中英

如何獲取EVF LiveView圖像的尺寸和格式?

[英]How to get dimensions and format of EVF LiveView Image?

首先,讓我發布指向一些通過Google找到的類似SO問題的鏈接。 第一個鏈接似乎有一個有效的答案,但沒有直接解決我的問題。 第二個鏈接確實直接解決了我的問題,但是gdh的回復似乎對我沒有幫助。

佳能LiveView:圖像轉換為OpenCV Mat

佳能EDSDK如何獲得實時取景圖像的寬度和高度?

我正在嘗試使用佳能的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM