【问题标题】:Avoid clean aperture cropping in CIImage imageWithCVImageBuffer避免 CIImage imageWithCVImageBuffer 中的干净孔径裁剪
【发布时间】:2013-10-24 15:28:30
【问题描述】:

我目前正在调整 ImageSnap 的一些内部结构,尝试进行临时修改,以便即时拍摄实时摄像机图像的快照。我注意到图像被调整大小,不考虑纵横比,并将问题追溯到以下行:

CVImageBufferRef frame;
// obtain frame
verbose("frame is %d x %d px\n", (int)CVPixelBufferGetWidth(frame),
                                 (int)CVPixelBufferGetHeight(frame));
CIImage *ciimg = [CIImage imageWithCVImageBuffer:frame];
verbose("CIImage has %d x %d px\n", (int)[ciimg extent].size.width,
                                    (int)[ciimg extent].size.height);

至少对于我正在使用的一个给定设备,这些行的输出是

frame is 1920 x 1080 px
CIImage has 1888 x 1062 px

显然图像已调整大小,尽管我没有看到代码的任何部分要求调整大小。这是从哪里来的,更重要的是,我该如何预防?

我正在使用以下文档,但在其中找不到提示:


编辑:据我所知,没有缩放,而是进行了裁剪,这是由于 干净的光圈 设置mentioned in the Core Video Programming Guide。所以现在的问题是如何将这个干净的光圈设置为全帧尺寸,或者如何避免转换考虑到这一点。

【问题讨论】:

    标签: objective-c macos core-image core-video


    【解决方案1】:

    你可以去掉干净的光圈数据

    CVBufferRemoveAttachment(frame, kCVImageBufferCleanApertureKey);
    

    在致电imageWithCVImageBuffer之前

    【讨论】:

    • 在不久的将来我将无法对此进行测试,但我只是假设它可以工作,直到我真正尝试一下。谢谢!
    【解决方案2】:

    来自 Apple 的 RosyWriter 应用程序:

    使用扩展宽度而不是宽度来考虑可能的行扩展(有时用于内存对齐):

    unsigned char *base = (unsigned char *)CVPixelBufferGetBaseAddress( pixelBuffer );
    size_t width = CVPixelBufferGetWidth( pixelBuffer );
    size_t height = CVPixelBufferGetHeight( pixelBuffer );
    size_t stride = CVPixelBufferGetBytesPerRow( pixelBuffer );
    size_t extendedWidth = stride / sizeof( uint32_t ); // each pixel is 4 bytes/32 bits
    

    万一第一个建议没有结果。

    【讨论】:

      猜你喜欢
      • 2017-04-09
      • 2015-12-23
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      相关资源
      最近更新 更多