OpenCV

トップ > チップス > OpenCV
2013-11-20, opencv

キャプチャされた画像(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

この記事は役に立ちましたか?