【发布时间】:2016-06-27 00:33:00
【问题描述】:
我正在为 iOS 编写一个 OpenCv Cordova 插件。我需要相机预览为全屏并保持所有 iOS 设备(iPhone、iPad)的纵横比。
我能够实现人像模式(参见代码),它在 iPhone 6/plus 上完美运行,但相机预览在 iPad 上略有拉伸,可能是因为 AVCaptureSessionPresetHigh 的支持的分辨率为 1280x720 .有人对如何实现单一方向(仅限横向或纵向)并保持纵横比有任何想法吗?
我目前启动相机的代码是
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
// Initialize imageView to fullscreen
imageView = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.view addSubview:imageView];
[imageView setContentMode:UIViewContentModeScaleAspectFill];
[imageView setClipsToBounds:YES];
self.videoCamera = [[FixedCvVideoCamera alloc] initWithParentView:imageView];
self.videoCamera.delegate = self;
self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack;
self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPresetHigh;
self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
self.videoCamera.defaultFPS = 30;
[self.videoCamera start];
}
请注意,我使用的是 FixedCvVideoCamera 而不是 OpenCv CvVideoCamera 类。原因是我继承并覆盖了 CvVideoCamera 的 layoutPreviewLayer 函数以保持纵向模式。
- (void)layoutPreviewLayer;
{
if (self.parentView != nil)
{
CALayer* layer = self->customPreviewLayer;
CGRect bounds = self->customPreviewLayer.bounds;
int rotation_angle = 0;
switch (defaultAVCaptureVideoOrientation) {
case AVCaptureVideoOrientationLandscapeRight:
rotation_angle = 270;
break;
case AVCaptureVideoOrientationPortraitUpsideDown:
rotation_angle = 180;
break;
case AVCaptureVideoOrientationLandscapeLeft:
rotation_angle = 90;
break;
case AVCaptureVideoOrientationPortrait:
default:
break;
}
layer.position = CGPointMake(self.parentView.frame.size.width/2., self.parentView.frame.size.height/2.);
layer.affineTransform = CGAffineTransformMakeRotation( DEGREES_RADIANS(rotation_angle) );
layer.bounds = bounds;
}
}
提前致谢。
【问题讨论】:
标签: ios xcode opencv avcapturesession