2016-01-08 3 views
2

Я пытаюсь преобразовать CMSampleBufferRef (как часть AVCaptureVideoDataOutputSampleBufferDelegate в iOS) в Matrix OpenCV, чтобы стабилизировать вывод в полуреальном режиме.Преобразование CMSampleBufferRef в cv :: Mat

Я запускаю тестовое приложение в момент, следующий за this, но продолжаю получать проблемы, когда создаю и использую Mat.

Swift контроллер

let wrapper : OpenCVWrapper = OpenCVWrapper() 
... 
func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) { 
    self.wrapper.processBuffer(sampleBuffer, self.previewMat) 
} 

OpenCVWrapper

- (void)processBuffer:(CMSampleBufferRef)buffer :(UIImageView*)previewMat { 
    // Convert current buffer to Mat 
    CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(buffer); 
    CVPixelBufferLockBaseAddress(pixelBuffer, 0); 

    CGFloat bufferWidth = CVPixelBufferGetWidth(pixelBuffer); 
    CGFloat bufferHeight = CVPixelBufferGetHeight(pixelBuffer); 

    unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer); 

    Mat tmp(bufferWidth, bufferHeight, CV_8UC4, pixel); 
    Mat cur = tmp.clone(); 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [previewMat setImage:[UIImage imageWithCVMat:cur]]; 
    }); 
    CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); 
} 

В Mat cur = tmp.clone() я получаю EXC_BAD_ACCESS

Любые мысли о том, что я делаю неправильно здесь?

Я пробовал bufferWidth и CGFloat и int и переключил их в конструкторе для Mat, то же самое.

+0

Вы пробовали: Mat tmp = Mat (bufferHeight, bufferWidth, CV_8UC4, pixel); Mat cur = tmp.clone(); – freshking

+0

Да, это тоже не сработало. Я закончил преобразование буфера в UIImage, а затем UIImage в Mat. Это сработало, но не ответило, так как оно не отвечает на вопрос. –

ответ

1

Может быть, это будет работать:

- (void)processBuffer:(CMSampleBufferRef)buffer :(UIImageView*)previewMat { 
{ 
    CVImageBufferRef imgBuf = CMSampleBufferGetImageBuffer(buffer); 

    // lock the buffer 
    CVPixelBufferLockBaseAddress(imgBuf, 0); 

    // get the address to the image data 
    void *imgBufAddr = CVPixelBufferGetBaseAddressOfPlane(imgBuf, 0); 

    // get image properties 
    int w = (int)CVPixelBufferGetWidth(imgBuf); 
    int h = (int)CVPixelBufferGetHeight(imgBuf); 

    // create the cv mat 
    cv::Mat image; 
    image.create(h, w, CV_8UC4); 
    memcpy(image.data, imgBufAddr, w * h); 

    // unlock again 
    CVPixelBufferUnlockBaseAddress(imgBuf, 0); 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [previewMat setImage:[UIImage imageWithCVMat:image]]; 
    }); 
} 
+1

Я получаю только верхнюю треть изображения, используя этот код. Захват образца: http://i.imgur.com/cRQ0OmL.png –

0

тип изображения не равны, вы должны попытаться сделать какие-то

cvtColor(image, image_copy, CV_BGRA2BGR); 

попробовать с другим типом CV_BGRA2BGR

Надежда помогает.

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