问题标签 [cvpixelbuffer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2437 浏览

swift - DepthData - 获取每像素深度数据(CVPixelBuffer 数据分析)

现在我AVDepthPhotoFilter从 iPhone7Plus 的立体摄像头运行 Rendering Depth Deta。

所以,我想访问每像素深度数据,但是,我不知道该怎么做。请指教。

0 投票
1 回答
1154 浏览

ios - 创建宽度倍数为 90 的 CVPixelBuffer 时每行字节错误

我正在处理从网络接收到的原始 yuv420 双平面帧数据,需要创建 CVPixelBuffer 以便将其处理为 Core Image 以及使用 AVAssetWriter 写入磁盘。

当我尝试使用下面的代码创建一个 CVPixelBuffer,宽度为 120、240 或 480 时,它会分配内存并为两个平面创建一个具有正确 bytePerRow 值的正确 CVPixelBuffer(例如,宽度 120 会产生 120 bytePerRow 的值)。

但是,当我输入宽度为 90、180 或 360 的帧时,它会产生错误的 bytePerRow,例如 192 bytePerRow,帧宽度为 180。这会导致稍后在 CoreImage 或 AVAssetWriter 中绘制问题。

请参阅下面的代码来创建 CVPixelBuffer。

请注意,我不能使用 CVPixelBufferCreateWithPlanarBytes,这会迫使我自己分配内存,并在稍后与不是此问题主题的 Core Image 一起使用时导致内存泄漏。

0 投票
0 回答
69 浏览

ios - 如何按像素编辑 CMPixelBuffer

我是一名本科生,正在编写一些 HumanSeg iPhone 应用程序。现在我必须从相机读取原始帧,但我发现官方指南中的代码不够清晰,我无法理解。

当我从相机获取帧(CMPixelBuffer格式)时,我需要对其进行修改(我的意思是我必须进行一些填充调整大小,并将其转换为CVPixelBuffer格式,以将其提供给 CoreML MobileNet)。

几周来我一直在寻找解决方案,但不幸的是我什么也没得到。在官方指南中,我被告知这些缓冲区“不提供对内部数据的直接访问”。

我什至尝试使用 aContext将 a 拉CMPixelBuffer入 aUIImage并将其拉回 a CVPixelBuffer,我发现这个过程非常缓慢,正如官方指南所说的那样。由于我正在做视频处理,这种方法是不可接受的。

我应该做什么或读什么?我真的很感谢你的帮助。

0 投票
0 回答
152 浏览

ios - GPUImageRawDataInput 与相机馈送

我的实现可能有几处问题,但我觉得它已经接近了。

我正在尝试使用 GPUImage 记录相机馈送,并设置一个动态叠加层,在视频录制时每秒更新 30 次(或 60 次)。我希望在录制视频后执行此操作。

在这种情况下,我有一个每秒更新 30 次的像素缓冲区,并且我正在从基地址 ( UnsafeMutablePointer<GLubyte>) 创建一个 GPUImageRawDataInput 对象。使用 GPUImageRawDataInput 对象,我将它的目标设置为“过滤器”变量,它只是一个 GPUImageFilter()。我不确定这是否是设置它的正确方法。

目前它正在录制的视频只是摄像头,没有覆盖。

0 投票
1 回答
625 浏览

floating-point - 如何将 CIImage 渲染到每通道 32 位浮点像素缓冲区中?

我想将 CIImage 渲染到 kCVPixelFormatType_128RGBAFloat 类型的像素缓冲区中。但是 CIContext.render() 没有说“不支持的格式”。我在运行 iOS 11 的 iPhone 7 Plus 上进行了测试。

这是我的代码:

缓冲区创建成功——断言没有触发。只有最后一行的渲染没有说“不支持的格式”。

我还尝试通过将第二个 nil 替换为来创建一个IOSurface 支持的 CVPixelBuffer[kCVPixelBufferIOSurfacePropertiesKey: [:]] as CFDictionary,但它没有帮助。

我怎样才能让它工作?

格式需要为 kCVPixelFormatType_128RGBAFloat,因为这里太复杂,无法进入,简短的版本是像素值的范围大于 0-255,包括不能四舍五入的小数值。

我尝试了更多的东西:

这些都不起作用。Core Image 不支持渲染到每通道浮点数 32 位还是每通道整数 16 位?

0 投票
0 回答
689 浏览

swift - 使用视觉的调度队列中 CVPixelBuffer 的内存泄漏

我在捕获管道中使用渲染器类向视频添加 CI 过滤器。在渲染器的 copyRenderedPixelBuffer 中,我还想复制像素缓冲区并将其发送到 Vision 以检测面部标志。

我为 Vision 制作了一个带有串行调度队列的单例。问题是,一旦我添加了调度队列,pixelBuffer 就不会从内存中释放 - 因此会发生大量泄漏(即使像素缓冲区在 objc 代码中被释放)。随着调度队列的静音,内存泄漏消失了(但是,由于 Vision 功能,视频预览存在大量视频延迟)。

非常感谢任何帮助!

Vision 的 Swift 类

0 投票
1 回答
5849 浏览

ios - 将 ARFrame 捕获的图像转换为 UIImage 方向问题

我想检测球并让 AR 模型与之交互。我使用 opencv 进行球检测并发送球中心,我可以使用它hitTest来获取sceneView. 我一直在转换CVPixelBufferUIImage使用以下功能:

这给了我旋转的图像:

在此处输入图像描述

然后我发现使用以下方法改变方向:

虽然它在设备处于纵向时给出了正确的方向,但将设备旋转到横向再次给出了旋转的图像。

现在我正在考虑使用viewWillTransition. 但在此之前我想知道:

  1. 如果有其他方法可以转换正确方向的图像?
  2. 为什么会这样?
0 投票
0 回答
1277 浏览

swift - 有没有更快的方法从 Swift 中的 UIImage 创建 CVPixelBuffer?

任务:实时录制视频并应用过滤器

问题从修改后的 UIImage 获取 CVPixelBuffer 太慢

我的相机的输出正在被过滤并直接进入 UIImageView 以便用户可以实时看到效果,即使在不录制视频或拍照时也是如此。我想要一些方法来记录这个不断变化的 UIImage 到视频,所以它不需要像我现在做的那样。目前,我通过将 CVPixelBuffer 附加到assetWriter 来做到这一点,但是由于我将过滤器应用于 UIImage,因此我将 UIImage 转换回缓冲区。我已经测试了使用和不使用 UIImage -> 缓冲区的情况,所以我已经证明这会导致不可接受的减速。

下面是 captureOutput 中的代码,注释清楚发生了什么,以及获取 UIImage 缓冲区的方法:

0 投票
1 回答
1593 浏览

swift - AVAssetReader 从 copyNextSampleBuffer() 获取像素缓冲区时遇到问题,Swift

我正在尝试使用 macOSX 上的 AVFoundation 和 AVAssetReader 从 Quicktime 电影文件中读取图像帧。我想通过 Metal 中的纹理贴图显示帧。有很多在线使用 AVAssetReader 的示例,但我无法让它为我想要的工作。

我可以从电影中读取基本帧数据——打印输出中的时间值、大小和持续时间看起来正确。但是,当我尝试获取 pixelBuffer 时,CMSampleBufferGetImageBuffer 返回 NULL。

此处已解决此问题(为什么 CMSampleBufferGetImageBuffer 返回 NULL),建议问题是必须在设置参数中指定视频格式而不是“nil”。所以我尝试用上面的“videoReaderSettings”替换“nil”,格式有各种值:kCVPixelFormatType_32BGRA、kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange 等。

结果是帧“时间”值仍然正确,但“大小”和“持续时间”值为 0。但是,CMSampleBufferGetImageBuffer 确实返回了一些内容,之前为 0。但屏幕上出现了垃圾。

这是将 pixelBuffer 转换为 Metal 纹理的函数。

当我能够将 pixelBuffer 传递给此函数时,它会报告图像的正确大小。但正如我所说,出现在屏幕上的是垃圾——实际上它是由最近的 Safari 浏览器页面组成的。我不确定问题出在第一个函数还是第二个函数中。CMSampleBufferGetImageBuffer 的非零返回值令人鼓舞,但大小和持续时间的 0 则不是。

我发现这个线程(CMSampleBufferRef 的缓冲区大小)表明大小和持续时间显示 0 可能不是问题,所以问题可能在于转换为金属纹理?

知道我做错了什么吗?
谢谢!

0 投票
1 回答
680 浏览

ios - 在某些设备上难以将像素缓冲区写入资产写入器

我正在我的应用程序中开发一个函数,将图像从我的示例缓冲区写入 AVAssetWriter。奇怪的是,这在 10.5" iPad Pro 上运行良好,但在7.9" iPad Mini 2上会导致崩溃。我无法理解相同的代码如何在两个不同的设备上出现问题。但这是我的代码;

我收到newPixelBuffer为零的错误,但同样,仅在 7.9 英寸 iPad 上。iPad Pro 正常运行,没有任何错误。有什么想法吗?谢谢!