먼저 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 변수가 일정하지 않다는 것입니다 (매번 상대적으로 작은 양으로 변하는 것 같습니다). 어떻게 가능합니까? 실제 이미지 크기가 일정하게 유지되는 경우?
어쨌든이 문제에 대한 도움을 주시면 감사하겠습니다. 라이브러리 기반 솔루션을 사용해 볼 수도 있지만 최대한 지연 시간을 줄이려고합니다. 추가 정보를 제공 할 수 있거나 실제 코드를보고 싶으면 (문제가있을 수있는 경우) 알려 주시기 바랍니다.
감사합니다,
존
고맙습니다. 그래서 대답은 jpg 이미지이며, 원시 바이트를 얻으려면 먼저 압축을 풀어야합니다. OpenCV는 그렇게 할 수있는 기능이 있지만 OpenGL 자체는 아닙니다.그러나 SDL2를 사용하여 OpenGL 컨텍스트를 만들므로 SDL 이미지에 필자가 필요한 것이 있습니다. – user1973454
@ user1973454, 맞습니다. jpg를 읽는데 문제가 있다면 항상 libjpeg와 같은 것을 사용할 수 있습니다. 매우 빨라야하며 OpenCV가 후드에서도 사용한다면 놀라지 않을 것입니다. –