5

openCv フレームワークを使用した ios ビデオ処理については、ここにあるチュートリアルを実行しようとしています。

プロジェクトにios openCvフレームワークを正常にロードしましたが、私のフレームワークとチュートリアルで提示されたものとの間に不一致あるようで、誰かが私を助けてくれることを願っています.

OpenCv はcv::Mat画像を表現するために type を使用します。AVfoundation 委任を使用してカメラからの画像を処理する場合、すべてCMSampleBufferRefをそのタイプに変換する必要があります。

チュートリアルで紹介されているopenCVフレームワークはusingというライブラリを提供しているようです

#import <opencv2/highgui/cap_ios.h>

新しいデリゲート コマンド:

CMSampleBufferRefこのフレームワークまたはとの間の高速変換を見つけることができる場所を教えてください。cv::Mat

編集

opencv フレームワークには多くのセグメンテーションがあります (少なくとも ios の場合)。さまざまな「公式」サイトからダウンロードし、fink や brew などのツールを使用して、その指示に従ってダウンロードしました。/usr/local/include/opencv/ にインストールされたヘッダー ファイルも比較しました。それらは毎回異なっていました。openCV プロジェクトをダウンロードすると、同じプロジェクト内にさまざまな cmake ファイルと競合する readme ファイルがあります。このリンク<opencv2/highgui/cap_ios.h>を介してフレームワークに組み込まれた avcapture 機能を備えた IOS の適切なバージョンを構築し (このヘッダーを使用) 、ios ディレクトリの python スクリプトを使用してライブラリを構築することに成功したと思います。頑張って更新しますpython opencv/ios/build_framework.py ios

4

2 に答える 2

13

これが私が使用する変換です。ピクセル バッファーをロックし、cv::Mat を作成し、cv::Mat で処理してから、ピクセル バッファーのロックを解除します。

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

CVPixelBufferLockBaseAddress( pixelBuffer, 0 );

int bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
int bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
int bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer);
unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);
cv::Mat image = cv::Mat(bufferHeight,bufferWidth,CV_8UC4,pixel, bytesPerRow); //put buffer in open cv, no memory copied
//Processing here

//End processing
CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );
}

上記の方法はメモリをコピーしないため、メモリを所有していないため、pixelBuffer がメモリを解放します。バッファの独自のコピーが必要な場合は、次のようにします

cv::Mat copied_image = image.clone();
于 2012-09-10T16:21:23.567 に答える