2014-08-11 1 views
2

Я использую AVCaptureVideoPreviewLayer, чтобы показать слой предварительного просмотра, образцы изображений из этого предварительного просмотра и выполнить некоторую обработку на нем. Обработка распознает некоторые моменты изображения и возвращает их. Я хочу показать эти точки на уровне предварительного просмотра (почти) в реальном времени.ios AVCaptureVideoPreviewLayer конвертирует между координатами камеры и экрана

У меня есть некоторые проблемы с преобразованием этих точек, особенно при переключении между ориентациями.

Это, как я установить предварительный просмотр слой:

self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession]; 
self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 

Это, как я получить изображение из слоя:

- (void)processPixelBuffer: (CVImageBufferRef)pixelBuffer { 

    CVPixelBufferLockBaseAddress(pixelBuffer, 0); 



    CVPixelBufferLockBaseAddress(pixelBuffer,0); 
    uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(pixelBuffer); 
    size_t bbytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer); 
    size_t width = CVPixelBufferGetWidth(pixelBuffer); 
    size_t height = CVPixelBufferGetHeight(pixelBuffer); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef myContext = CGBitmapContextCreate(baseAddress, width, height, 8, bbytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 

    self.cgImage = CGBitmapContextCreateImage(myContext); 
    CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); 

    //image processing ... 
} 

Теперь то, что я получаю точки в этом изображении системе координат. Что мне нужно - это метод преобразования его в экранные координаты, чтобы представить его на экране

Любые идеи?

ответ

1

ОК, так что после повторного прочтения API AVCapturePreviewLayer, здесь довольно смирительную вперед и простое решение:

CGFloat imWidth = CGImageGetWidth(self.cgImage); 
CGFloat imHeight = CGImageGetHeight(self.cgImage); 

CGPoint point = /* point in image coordinates*/; 
point.x = point.x/imWidth; 
point.y = point.y/imHeight; 
CGPoint screenPoint = [self.previewLayer pointForCaptureDevicePointOfInterest:point]; 

Пробовал этот метод на первый, но получил странный результат, потому что я забыл, чтобы нормализовать координаты в значения от 0.0 до 1.0 при необходимости.

BTV, наоборот возможно также с помощью метода

captureDevicePointOfInterestForPoint: