我正在创建一个使用OpenCV来解析iPhone摄像头输出并在屏幕上显示结果的应用程序。我知道iPhone相机以横向方向读取,因此需要在屏幕上显示结果之前进行转换。我想我只需要缩放,旋转-90度然后平移(tx =图像的宽度),但这不起作用。我在网上找到了一些示例代码,如下所示,但是除了横向以外的任何方向都没有。
从相机视图转换为用户视图的正确方法是什么?
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
//lock the pixel buffer
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer( sampleBuffer );
CVPixelBufferLockBaseAddress( pixelBuffer, 0 );
//declare variables
int bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
int bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
//a bunch of OpenCV stuff that finds features in an image and
// returns a cameraRect
//translate to view coordinates
float scaleX = 320 / (float)bufferHeight;
float scaleY = 460 / (float)bufferWidth;
deviceRect.origin.x = 320 - ((cameraRect.y + cameraRect.height) * scaleX);
deviceRect.origin.y = (cameraRect.x * scaleY);
CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );
}
//elsewhere
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
编辑:如果不工作,我的意思是屏幕上显示的矩形与预览图层中可见的匹配对象不对应。我正在检测面部,并且根据电话设备的方向,屏幕上绘制的每个屏幕都会从预览图层中的面部略微偏离。在左侧横向,deviceRect完美匹配可见面。