核心图像坐标系

6

我从一个AVAsset中得到了一个CVPixelBufferRef。 我想对它应用一个CIFilter。 我使用以下代码:

CVPixelBufferRef pixelBuffer = ...
CVPixelBufferRef newPixelBuffer = // empty pixel buffer to fill
CIContex *context = // CIContext created from EAGLContext
CGAffineTransform preferredTransform = // AVAsset track preferred transform
CIImage *phase1 = [CIImage imageWithCVPixelBuffer:pixelBuffer];
CIImage *phase2 = [phase1 imageByApplyingTransform:preferredTransform];
CIImage *phase3 = [self applyFiltersToImage:phase2];

[context render:phase3 toCVPixelBuffer:newPixelBuffer bounds:phase3.extent colorSpace:CGColorSpaceCreateDeviceRGB()];

很不幸,我获得的结果方向不正确。例如,以纵向模式拍摄的视频是倒置的。我猜问题在于从 AVAsset 转换到 CoreImage 坐标系统(在XCode中为 phase2 显示预览也会呈现不正确的结果)。如何解决?


你是否曾经设法找出如何修复纵向视频的方向?我也遇到了同样的问题,但无法确定是否只需要设置某些选项。 - Jon Andersen
那是一段时间之前的事情了,所以我记不清楚了,但我猜我像你在答案中所做的那样硬编码了转换。 - Tomasz Bąk
1个回答

6

我通过这种方法解决了它,它应该正确地定位到坐标空间中的所有内容。

var preferredTransform = inst.preferredTransform
preferredTransform.b *= -1
preferredTransform.c *= -1

var outputImage = CIImage(cvPixelBuffer: videoFrameBuffer)
                    .applying(preferredTransform)
outputImage = outputImage.applying(CGAffineTransform(translationX: -outputImage.extent.origin.x, y: -outputImage.extent.origin.y))

嘿,Jon,为什么需要翻译?在处理许多源帧时,这样做会导致性能问题吗?(例如对视频进行滤镜处理) - Roi Mulia
嗨,我认为它不应该有太大的性能损失,因为你总是会执行preferredTransform。当我实施它时,我的应用程序中没有注意到任何问题。 - Jon Andersen
嘿,Jon!应用正确的变换然后缩放CIImage会导致图像以一种拉伸的方式呈现(适用于纵向视频)。你有什么想法可以解决这个问题吗? - Roi Mulia
谢谢你的有效回答Jon,有没有可能详细解释一下这到底是做什么的?是否有更详细的版本可以阅读,以及为什么会发生这种情况? - Ian Bytchek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接