AVFoundation とそのキャプチャ サポートについては知っています (あまり詳しくありませんが)。ただし、ピクセル単位のデータ (ピクセルごとの RGB など) を取得するための簡単にアクセスできる API は見当たりません。これが可能であることをドキュメントで読んだことを思い出しますが、実際にはその方法がわかりません。そう:
- これはできますか?もしそうなら、どのように?
- 生の画像データを取得するのですか、それとも JPEG 圧縮されたデータを取得するのですか?
AVFoundation とそのキャプチャ サポートについては知っています (あまり詳しくありませんが)。ただし、ピクセル単位のデータ (ピクセルごとの RGB など) を取得するための簡単にアクセスできる API は見当たりません。これが可能であることをドキュメントで読んだことを思い出しますが、実際にはその方法がわかりません。そう:
AV Foundation は、ビデオ カメラまたはスチル カメラでキャプチャした画像の raw バイトを返すことができます。適切な AVCaptureDevice と、対応する AVCaptureDeviceInput および AVCaptureDeviceOutput (AVCaptureVideoDataOutput または AVCaptureStillImageOutput) を使用して AVCaptureSession を設定する必要があります。Apple のドキュメントにはこのプロセスの例がいくつかあり、設定には定型コードが必要です。
キャプチャ セッションを構成し、カメラからデータをキャプチャしたら-captureOutput:didOutputSampleBuffer:fromConnection:
、パラメータの 1 つが CMSampleBufferRef になるデリゲート メソッドを設定します。その中に CVImageBufferRef があり、 経由でアクセスしCMSampleBufferGetImageBuffer()
ます。そのピクセル バッファーでを使用CVPixelBufferGetBaseAddress()
すると、カメラ フレームを表す生のピクセル データのバイト配列のベース アドレスが返されます。これにはいくつかの異なる形式がありますが、最も一般的なのは BGRA と平面 YUV です。
これを使用するサンプル アプリケーションはこちらにありますが、標準の AV Foundation ボイラープレートをラップし、GPU での画像処理を簡単にするオープン ソース フレームワークも参照することをお勧めします。これらの未加工のカメラ バイトで何をしたいかによっては、そこで使用できるもの、またはオン CPU 処理よりもはるかに高速に実行する手段を既に持っている可能性があります。
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);
}