2016-08-22 12 views
0

cv :: MatデータをsampleBufferにコピーするにはどうしたらいいですか?cv :: MatをCMSampleBufferRefにコピー

私のシナリオは次の通りです: ランドマークの検出のためにpixelBufferからcv :: Matを作成し、ランドマークをcv :: Mat画像データに追加します。私はこのcv :: Matを標本バッファにコピーして、ランドマークと一緒に表示したいと思います。

これは可能ですか?

私はDLIBでこれを達成したがCV ::マットでそれを行う方法を知っておく必要があります:私は自分の質問に答えるのです

char *baseBuffer = (char *)CVPixelBufferGetBaseAddress(imageBuffer); 
img.reset(); 
long position = 0; 
while (img.move_next()) { 
     dlib::bgr_pixel& pixel = img.element(); 
     long bufferLocation = position * 4; //(row * width + column) * 4; 
     char b = baseBuffer[bufferLocation]; 
     char g = baseBuffer[bufferLocation + 1]; 
     char r = baseBuffer[bufferLocation + 2]; 
     dlib::bgr_pixel newpixel(b, g, r); 
     pixel = newpixel; 

     position++; 
    } 
+0

おそらくはい。もう少し詳しく?いくつかのコード? – Miki

+0

'CVImageBufferRef'をcv :: matに変換するには、この回答に従ってください(http://stackoverflow.com/a/12355675/3649485)。 このcv :: matをサンプルバッファに戻したいと思います。私はsampleBufferにピクセルをコピーすることによってdlibを行う方法を知っていますが、openCVを使ってそれを行う方法がわかりません 次のコメントでdlibのサンプルコード – mosn

+0

質問に正しい形式でコードを投稿してください。コメント内では読み込めません – Miki

答えて

3

まず最初は、あなたが、私はあなたがbasebufferから始まるバッファにピクセルをコピーする必要が続いて、この偉大なsolution

を追っCV ::マット画像の画素データにアクセスする必要があります。コードは、あなたがこれを達成するのを助ける必要があり、以下:

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
char *baseBuffer = (char *)CVPixelBufferGetBaseAddress(imageBuffer); 
long position = 0; 
uint8_t* pixelPtr = (uint8_t*)targetImage.data; 
int cn = targetImage.channels(); 
cv::Scalar_<uint8_t> rgbPixel; 
for(int i = 0; i < targetImage.rows; i++) 
{ 
    for(int j = 0; j < targetImage.cols; j++) 
    { 
     long bufferLocation = position * 4; 

     rgbPixel.val[0] = pixelPtr[i*targetImage.cols*cn + j*cn + 0]; // B 
     rgbPixel.val[1] = pixelPtr[i*targetImage.cols*cn + j*cn + 1]; // G 
     rgbPixel.val[2] = pixelPtr[i*targetImage.cols*cn + j*cn + 2]; // R 
     baseBuffer[bufferLocation] = rgbPixel.val[2]; 
     baseBuffer[bufferLocation + 1] = rgbPixel.val[1]; 
     baseBuffer[bufferLocation + 2] = rgbPixel.val[0]; 
     position++; 
    } 
} 

  • のノートを取るためにいくつかのものは、操作の前と後のあなたCVPixelBufferLockBaseAddressCVPixelBufferUnlockBaseAddressを確認してください。 I
  • CV_8UC3でこれを実行している場合は、cv :: mat
    タイプを確認してください。
  • 私はパフォーマンス分析を行っていませんが、これで滑らかな出力が得られます。
+0

なぜ 'CV_8UC3'ですか? 'CMSampleBuffer'自体が4チャンネルを持っています – user924

+0

ええこのメソッドはCPUをかなり食べます。あなたのアプリには多くの機能がないと滑らかになりますが、多くの機能を使用している場合はCPU使用率が面白いです – user924

+0

'next solution' baseBuffer [bufferLocation] = pixelPtr [i * targetImage.cols * cn + j * cn + 0];baseBuffer [bufferLocation + 1] = pixelPtr [i * targetImage.cols * cn + j * cn + 1];私は 'videoOutput.videoSettings = [(文字列としてのkCVPixelBufferPixelFormatTypeKey)を使用していると思います:NSNumber(値:kCVPixelFormatType_32BGRA as UInt32)] ' – user924

関連する問題