2016-08-22 4 views
0

Как я могу скопировать данные cv :: Mat обратно в sampleBuffer?Копировать cv :: Mat в CMSampleBufferRef

Мой сценарий выглядит следующим образом: Создаю cv :: Mat из pixelBuffer для определения ориентира и добавьте ориентиры в cv :: Mat изображения. Я хотел бы скопировать этот cv :: Mat в буфер образца, который будет показан с ориентиром.

Возможно ли это?

Я достиг этого с dlib, но нужно знать, как сделать это с сортом :: ковриком:

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

Я следую этому [ответ] (http://stackoverflow.com/a/12355675/3649485), чтобы преобразовать 'CVImageBufferRef' в cv :: mat. Теперь я хотел бы поместить этот cv :: mat обратно в буфер образца. Я знаю, как это сделать с помощью dlib, копируя пиксели обратно в sampleBuffer, но не знаю, как это сделать с помощью openCV Пример кода для dlib в следующем комментарии – mosn

+0

Пожалуйста, разместите код, правильно отформатированный в вопросе. Это не читается в комментарии – Miki

ответ

3

я отвечаю на мой собственный вопрос.

Первое, что вам нужно, чтобы получить доступ к пиксельных данных резюме :: мат изображения, я последовал за этой большой solution

Затем вам нужно скопировать пиксель в буфер, начиная с basebuffer. После кода должны помочь вам достичь этого:

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++; 
    } 
} 

Некоторые вещи, чтобы принять к сведению

  • убедитесь, что вы CVPixelBufferLockBaseAddress и CVPixelBufferUnlockBaseAddress до и после операции. I
  • Я делаю это на CV_8UC3, вы можете проверить свой cv :: mat
    тип.
  • Я не сделал анализ производительности, но я получаю гладкий выход с этим.
+0

, почему 'CV_8UC3'? 'CMSampleBuffer' сам имеет 4 канала – user924

+0

Да, этот метод довольно ест процессор, если в вашем приложении не так много функций, тогда он будет плавным, но если у вас есть много функций, которые вам интересны в использовании процессора, то – 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];baseBuffer [bufferLocation + 2] = pixelPtr [i * targetImage.cols * cn + j * cn + 2]; 'Я предполагаю, потому что я использую' videoOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as String): NSNumber (значение: kCVPixelFormatType_32BGRA as UInt32)] ' – user924

Смежные вопросы