カメラから画像のピクセルを取得したいと思います。 CoreFoundationとOpenGLを使用していますが、イメージをレンダリングすることができますが、他の場所(スレッド)で他のものをやりたいのでコピーする必要があります。カメラ入力からピクセルをコピーする
これは私がしようとしたものです:(AVCaptureVideoDataOutputSampleBufferDelegate法の一部)のアプローチ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);
は、必要なときに、私は後でピクセルをコピーすることができますので、穴のバッファを保持しようとしましたが、私は常にNULLを取得しますポインタ(理由は分かりません)
アプローチBIでは、毎回ピクセルをコピーしようとしますが、次にOpenGLレンダラーは黒い画像を表示します。なぜ私は元のバッファを変更していないのですか?事前に
おかげで、あなたのアプローチのBで)
イグナシオ
あなたは正しいですが、手前のメモリをmallocしてdeallocメソッドで解放しても、まだ黒い画面が表示されます。私は、glTexSubImage2Dの後にアプローチBを置くと、フレームをレンダリングすることに気付きましたが、なぜそれが不思議ですか?私は元のデータを扱っていません。私はそれをコピーしています。 – nacho4d
上記のmemcpyを呼び出すと、実際にピクセルバッファの内容が新しく割り当てられたメモリで上書きされます。署名は です。void * memcpy(void * destination、const void * source、size_t num); –