ios AVCaptureVideoPreviewLayer在摄像头和屏幕坐标之间进行转换

时间:2014-08-11 13:13:07

标签: ios xcode ios7 avcapturesession

我使用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 个答案:

答案 0 :(得分:2)

好的,所以在重新阅读AVCapturePreviewLayer API之后,这是一个非常简单明了的解决方案:

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之间的值,如此函数文档所需。

顺便说一下,方法

也可以采用相反的方法
captureDevicePointOfInterestForPoint: