gpt4 book ai didi

ios AVCaptureVideoPreviewLayer 在相机和屏幕坐标之间转换

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:04:21 27 4
gpt4 key购买 nike

我使用 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 ...
}

现在我得到的是这个图像坐标系中的点。我需要的是一种将其转换为屏幕坐标以将其呈现在屏幕上的方法

有什么想法吗?

最佳答案

好的,所以在重新阅读 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:

关于ios AVCaptureVideoPreviewLayer 在相机和屏幕坐标之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25244141/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com