카메라의 이미지 픽셀을 얻고 싶습니다. 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에서
이그나시오
당신은 맞습니다.하지만 메모리를 손으로 malloc하고 dealloc 메서드에서 해제해도 여전히 검정색 화면이 나타납니다. 나는 glTexSubImage2D 이후에 접근 B를 넣으면 프레임을 렌더링하지만, 왜 그런지 궁금하다. 원본 데이터를 처리하지 않습니다. 나는 그것을 복사하고있다. – nacho4d
위의 memcpy를 호출하면 실제로 픽셀 버퍼의 내용을 새로 할당 된 메모리로 덮어 씁니다. 서명은 입니다. void * memcpy (void * destination, const void * source, size_t num); –