2010-12-11 8 views
1

카메라의 이미지 픽셀을 얻고 싶습니다. CoreFoundation과 OpenGL을 사용하고 있으며 이미지를 렌더링 할 수 있지만 다른 장소 (/ 스레드)에서 다른 것들을 복사하고 싶습니다. 그래서 복사해야합니다. 접근 AI에카메라 입력에서 픽셀 복사하기

CVImageBufferRef tmpPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
CVPixelBufferLockBaseAddress(tmpPixelBuffer, 0); 

//APPROACH A 
CFRetain(tmpPixelBuffer); 
if(pixelBuffer!= 0) CFRelease(pixelBuffer); 
pixelBuffer = tmpPixelBuffer; 

//create and bind textureHandle 
if(m_textureHandle==0) m_textureHandle = [self _createVideoTextureUsingWidth:videoDimensions.width Height:videoDimensions.width]; 
glBindTexture(GL_TEXTURE_2D, m_textureHandle); 

unsigned char *linebase = (unsigned char *)CVPixelBufferGetBaseAddress(tmpPixelBuffer); 

//APPROACH B 
unsigned size = videoDimensions.width*videoDimensions.height*4;//since its BGRA 
unsigned char *imageData = malloc(size); 
memcpy(linebase, imageData, size); 
free(imageData); 

//map the texture 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, videoDimensions.width, videoDimensions.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, linebase); 

CVPixelBufferUnlockBaseAddress(tmpPixelBuffer, 0); 

이 필요로 할 때 내가 나중에 픽셀을 복사 할 수 있습니다 구멍 버퍼를 유지하기 위해 노력했다 (AVCaptureVideoDataOutputSampleBufferDelegate 방법의 일부),하지만 난 항상 NULL을 얻을 :

내가 시도 것입니다 포인터 (왜 그런지 모르겠다)

접근법 BI에서는 매번 픽셀을 복사하려고하지만 그 다음에 OpenGL 렌더러는 검은 색 이미지를 표시합니다. 이유는 모르겠지만 원래 버퍼를 수정하지 않습니까? 사전에

감사합니다, 당신은 그것으로 픽셀 버퍼를 복사 한 후 즉시) 당신의 접근 방식의 B에서

이그나시오

답변

0

, 당신은 imageData의 무료. 디버그 모드에서 실행중인 경우 메모리 관리자가 메모리를 지울 가능성이 있습니다. 어떤 경우에도 데이터를 완전히 마칠 때까지 free()를 호출하지 마십시오.

+0

당신은 맞습니다.하지만 메모리를 손으로 malloc하고 dealloc 메서드에서 해제해도 여전히 검정색 화면이 나타납니다. 나는 glTexSubImage2D 이후에 접근 B를 넣으면 프레임을 렌더링하지만, 왜 그런지 궁금하다. 원본 데이터를 처리하지 않습니다. 나는 그것을 복사하고있다. – nacho4d

+0

위의 memcpy를 호출하면 실제로 픽셀 버퍼의 내용을 새로 할당 된 메모리로 덮어 씁니다. 서명은 입니다. void * memcpy (void * destination, const void * source, size_t num); –