2012-06-02 19 views
9

我知道AVFoundation及其捕獲支持(雖然不太熟悉)。但是,我沒有看到任何可以輕鬆訪問的API來獲取逐像素數據(RGB-per-pixel或類似)。我記得在文檔中看到這是可能的,但我真的不知道如何。所以:iOS:從相機獲取逐像素數據

  1. 可以這樣做嗎?如果是這樣,怎麼樣?
  2. 我會得到原始圖像數據,還是已被JPEG壓縮的數據?

回答

31

AV Foundation可以讓您恢復由視頻或靜態攝像頭捕獲的圖像的原始字節。您需要使用適當的AVCaptureDevice和相應的AVCaptureDeviceInput和AVCaptureDeviceOutput(AVCaptureVideoDataOutput或AVCaptureStillImageOutput)來設置AVCaptureSession。蘋果在他們的文檔中有這個過程的一些例子,它需要一些樣板代碼來配置。

配置完捕獲會話並從攝像頭捕獲數據後,您將設置一個代理方法,其中一個參數爲CMSampleBufferRef。這將有一個CVImageBufferRef,你可以通過CMSampleBufferGetImageBuffer()訪問。在該像素緩衝區上使用CVPixelBufferGetBaseAddress()將返回代表相機幀的原始像素數據的字節數組的基地址。這可以有幾種不同的格式,但最常見的是BGRA和平面YUV。

我有一個使用這個here的示例應用程序,但是我建議您也看看my open source framework,它包裝了標準的AV Foundation樣板,並且可以很容易地在GPU上執行圖像處理。根據你想要用這些原始相機字節做什麼,我可能已經有了一些你可以在那裏使用的東西,或者比在CPU上處理更快的方法。

+3

終於可以這樣......你張貼在這裏的代碼確實幫助,但: http://stackoverflow.com/a/11615472/472768 謝謝! – FeifanZ

+0

你能解釋一下我應該在這種情況下輸入這個函數嗎? 'AlprResults可以識別(unsigned char * pixelData,int bytesPerPixel,int imgWidth,int imgHeight,std :: vector regionsOfInterest);''''我明白只針對'pixelData'和'regionsOfInterest'。 –

+0

@SashaKid - 我不知道這個功能是幹什麼的,這聽起來像是一個完全獨立的問題。 –

-4
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); 
float luminance = dot(textureColor.rgb, W); 

mediump vec2 p = textureCoordinate; 
if (p.x == 0.2 && p.x<0.6 && p.y > 0.4 && p.y<0.6) { 
    gl_FragColor = vec4(textureColor.r * 1.0, textureColor.g * 1.0, textureColor.b * 1.0, textureColor.a); 
} else { 
    gl_FragColor = vec4(textureColor.r * 0.0, textureColor.g * 0.0, textureColor.b * 0.0, textureColor.a *0.0); 
}