キャプチャされた画像(CMSampleBufferRef)をMatに変換
今まで、CGImageを経由していましたが、この方法でさくっとMatに変換できます。素晴らしい。CGImageを作っていた時に12秒おきに発生していた謎のメモリリークもこれで出なくなりました。何故かメモリの占有量は以前よりも増えているのですが、(リークが無くなったので)じわじわと増加する現象は収まったようです。
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress( pixelBuffer, 0 );
size_t w = CVPixelBufferGetWidth(pixelBuffer);
size_t h = CVPixelBufferGetHeight(pixelBuffer);
uint8_t *base = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);
cv::Mat mat = cv::Mat(h,w,CV_8UC4,base);
//Processing here
CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );
}
(以下、余談です)
そもそも、CGImageの使用に疑問が出て来たのが、以下の不可思議なエラーに出会うようになったことが発端です。CGCreateXXX系のメソッドで確保した領域はReleaseで変換してあげなければいけないはずなのに、Releaseメソッドが時々これらのエラーを吐くのですね。Releaseを消せば動くのですが、代わりにじわじわとリークし始めるという…。
Assertion failed: (!space->is_singleton), function color_space_dealloc, file ColorSpaces/CGColorSpace.c, line 178
ついでに、以下のコンパイルエラーも時々出会うのでメモ。C++系のコードを利用するObjective-Cのファイル拡張子は「.m」ではなくて「.mm」です。コンパイラは一つずつしか警告を出してくれないので、あちこちでインクルードするソースコード内にC++の記述が含まれている場合は注意が必要です(いっそ全部.mmにしてしまえば良いのかもしれませんが)。
'list' file not found
参考URL
この記事は役に立ちましたか?
- EnglishWorm.com
- SinglesFan.com
- LmLab.net
- サイトマップ
- 運営者について