2016-09-10 8 views
0

먼저 Google을 통해 찾은 비슷한 질문에 대한 링크를 게시하겠습니다. 첫 번째 링크에는 유효한 답변이있는 것 같지만 직접 내 문제를 해결하지는 않습니다. 두 번째 링크는 직접 내 문제를 해결하지만 gdh의 응답은 저를 도와주지 않는 것 같습니다.EVF LiveView 이미지의 크기 및 형식을 얻는 방법은 무엇입니까?

나는 캐논의 EDSDK를 사용하여 라이브 뷰 모드에서 내 캐논 반란군에서 다운로드 영상을하려고하고 무엇

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

Canon LiveView: image convertion to OpenCV Mat

. 스트림을 열고 연속적으로 데이터 스트림을 다운로드 할 수는 있지만 사용할 수없는 이미지로 데이터를 변환하는 방법이 무엇인지 잘 모르겠습니다. 궁극적으로 내 목표는 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 변수가 일정하지 않다는 것입니다 (매번 상대적으로 작은 양으로 변하는 것 같습니다). 어떻게 가능합니까? 실제 이미지 크기가 일정하게 유지되는 경우?

어쨌든이 문제에 대한 도움을 주시면 감사하겠습니다. 라이브러리 기반 솔루션을 사용해 볼 수도 있지만 최대한 지연 시간을 줄이려고합니다. 추가 정보를 제공 할 수 있거나 실제 코드를보고 싶으면 (문제가있을 수있는 경우) 알려 주시기 바랍니다.

감사합니다,

답변

1

은 내가 아는 한 라이브 뷰의 크기를 얻을 수없는 기능이없는 그리고 그것은 또한 정말 필요는 없습니다. 다운로드하는 라이브 뷰 프레임은 표준 jpg이므로 헤더를 읽으면 크기를 확인할 수 있습니다. OpenCV 또는 OpenGL이 jpg 이미지와 함께 작동하는 방법을 모르지만 해당 형식을 읽는 것을 지원하는 경우 일부 기능이 있다고 확신합니다. 그렇지 않으면 많은 jpg 라이브러리 중 하나를 사용할 수 있습니다. jpg 압축은 왜 프레임간에 이미지 크기가 다른지 설명합니다.

실제로 keddsPropID_Evf_CoordinateSystem으로 EdsGetPropertyData를 호출하면 실제 화면 좌표계 크기가됩니다. 확실히 라이브 뷰 크기가 아닙니다. 나는 그것이 사진 크기에 더 가깝다고 생각하지만, 그것에 대해 완전히 확신하지는 않는다.

+0

고맙습니다. 그래서 대답은 jpg 이미지이며, 원시 바이트를 얻으려면 먼저 압축을 풀어야합니다. OpenCV는 그렇게 할 수있는 기능이 있지만 OpenGL 자체는 아닙니다.그러나 SDL2를 사용하여 OpenGL 컨텍스트를 만들므로 SDL 이미지에 필자가 필요한 것이 있습니다. – user1973454

+0

@ user1973454, 맞습니다. jpg를 읽는데 문제가 있다면 항상 libjpeg와 같은 것을 사용할 수 있습니다. 매우 빨라야하며 OpenCV가 후드에서도 사용한다면 놀라지 않을 것입니다. –