菜鸟教程小白 发表于 2022-12-12 11:23:50

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


                                            <p><p>我使用 AVCaptureVideoPreviewLayer 显示预览视频层,从该预览中采样图像并对其进行一些处理。
该处理识别图像上的一些点并返回它们。我想(几乎)实时在预览层上显示这些点。</p>

<p>我在转换这些点时遇到了一些麻烦,尤其是在方向之间切换时。</p>

<p>这就是我安装预览层的方式:</p>

<pre><code>self.previewLayer = [ initWithSession:self.captureSession];
self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
</code></pre>

<p>这就是我从图层获取图像的方式:</p>

<pre><code>- (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 ...
}
</code></pre>

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

<p>有什么想法吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>好的,所以在重新阅读 AVCapturePreviewLayer API 之后,这里有一个非常简单的解决方案:</p>

<pre><code>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 = ;
</code></pre>

<p>一开始尝试了这种方法,但结果很奇怪,因为我忘记按照这个函数文档的要求将坐标标准化为 0.0 到 1.0 之间的值。</p>

<p>顺便说一句,其他方法也可以使用该方法</p>

<pre><code>captureDevicePointOfInterestForPoint:
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios AVCaptureVideoPreviewLayer 在相机和屏幕坐标之间转换,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/25244141/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/25244141/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios AVCaptureVideoPreviewLayer 在相机和屏幕坐标之间转换