- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试将 CMSampleBuffer
从相机输出转换为 vImage
,然后再进行一些处理。不幸的是,即使没有任何进一步的编辑,我从缓冲区获得的帧也有错误的颜色:
实现(不考虑内存管理和错误):
配置视频输出设备:
videoDataOutput = AVCaptureVideoDataOutput()
videoDataOutput.videoSettings = [String(kCVPixelBufferPixelFormatTypeKey): kCVPixelFormatType_32BGRA]
videoDataOutput.alwaysDiscardsLateVideoFrames = true
videoDataOutput.setSampleBufferDelegate(self, queue: captureQueue)
videoConnection = videoDataOutput.connection(withMediaType: AVMediaTypeVideo)
captureSession.sessionPreset = AVCaptureSessionPreset1280x720
let videoDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
guard let videoDeviceInput = try? AVCaptureDeviceInput(device: videoDevice) else {
return
}
从从相机接收到的 CASampleBuffer
创建 vImage
:
// Convert `CASampleBuffer` to `CVImageBuffer`
guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
var buffer: vImage_Buffer = vImage_Buffer()
buffer.data = CVPixelBufferGetBaseAddress(pixelBuffer)
buffer.rowBytes = CVPixelBufferGetBytesPerRow(pixelBuffer)
buffer.width = vImagePixelCount(CVPixelBufferGetWidth(pixelBuffer))
buffer.height = vImagePixelCount(CVPixelBufferGetHeight(pixelBuffer))
let vformat = vImageCVImageFormat_CreateWithCVPixelBuffer(pixelBuffer)
let bitmapInfo:CGBitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.last.rawValue | CGBitmapInfo.byteOrder32Little.rawValue)
var cgFormat = vImage_CGImageFormat(bitsPerComponent: 8,
bitsPerPixel: 32,
colorSpace: nil,
bitmapInfo: bitmapInfo,
version: 0,
decode: nil,
renderingIntent: .defaultIntent)
// Create vImage
vImageBuffer_InitWithCVPixelBuffer(&buffer, &cgFormat, pixelBuffer, vformat!.takeRetainedValue(), cgColor, vImage_Flags(kvImageNoFlags))
将缓冲区转换为 UIImage:
为了测试,将 CVPixelBuffer 导出到 UIImage,但将其添加到视频缓冲区具有相同的结果。
var dstPixelBuffer: CVPixelBuffer?
let status = CVPixelBufferCreateWithBytes(nil, Int(buffer.width), Int(buffer.height),
kCVPixelFormatType_32BGRA, buffer.data,
Int(buffer.rowBytes), releaseCallback,
nil, nil, &dstPixelBuffer)
let destCGImage = vImageCreateCGImageFromBuffer(&buffer, &cgFormat, nil, nil, numericCast(kvImageNoFlags), nil)?.takeRetainedValue()
// create a UIImage
let exportedImage = destCGImage.flatMap { UIImage(cgImage: $0, scale: 0.0, orientation: UIImageOrientation.right) }
DispatchQueue.main.async {
self.previewView.image = exportedImage
}
最佳答案
尝试在您的 CV 图像格式上设置色彩空间:
let vformat = vImageCVImageFormat_CreateWithCVPixelBuffer(pixelBuffer).takeRetainedValue()
vImageCVImageFormat_SetColorSpace(vformat,
CGColorSpaceCreateDeviceRGB())
...并更新对 vImageBuffer_InitWithCVPixelBuffer
的调用以反射(reflect) vformat
现在是托管引用这一事实:
let error = vImageBuffer_InitWithCVPixelBuffer(&buffer, &cgFormat, pixelBuffer, vformat, nil, vImage_Flags(kvImageNoFlags))
最后,您可以删除以下行,vImageBuffer_InitWithCVPixelBuffer
正在为您完成这项工作:
// buffer.data = CVPixelBufferGetBaseAddress(pixelBuffer)
// buffer.rowBytes = CVPixelBufferGetBytesPerRow(pixelBuffer)
// buffer.width = vImagePixelCount(CVPixelBufferGetWidth(pixelBuffer))
// buffer.height = vImagePixelCount(CVPixelBufferGetHeight(pixelBuffer))
请注意,您不需要锁定 Core Video 像素缓冲区,如果您检查 headerdoc,它说“在调用此函数之前不需要锁定 CVPixelBuffer”。
关于swift - 转换为 vImage 的 CMSampleBuffer 帧颜色错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46140785/
嗨,我需要快速缩放灰度图像,所以我尝试了 vImage,但应用程序崩溃了,请帮忙。在下面的代码中 srcimg.data/dstimg.data 是指向无符号字符图像数据(单 channel 仅灰度数
我使用 vImageHistogramCalculation_ARGB8888(...) 计算直方图。我现在有存储在 256 个 bin 中的三个 RGB channel 中每个 channel 的直
我正在 try catch 显示器的内容并将显示器的色彩空间转换为 sRGB。我正在尝试使用 vImage 和低级 ColorSync 转换 API 来执行此操作,但输出的像素 block 奇怪地加倍
我在 Cocoa Touch 中使用 vImages,在我的例子中,它基本上是 ARGB float 组,我需要进行子采样。低通滤波使用 vImage 函数没有问题,但如何从 2x2 像素中选择一个(
此代码每次都在嵌套循环中运行 9600 次,并且在 iPhone4S 上的总运行时间必须低于 30 毫秒: vImage_Buffer source = { sourceArea.data, patc
我一直在使用 OpenCV 和 Apple 的 Accelerate 框架,发现 Accelerate 的性能很慢,Apple 的文档也很有限。让我们举个例子: void equalizeHistog
我尝试使用 vImageConvert_RGB888toPlanar8 从图像中提取所有 3 个 channel ,然后使用 vImageConvert_Planar8toRGB888 将它们放回一起
我已经阅读了我能找到的所有文档,但无法让简单的 vImage 调用起作用。我只需要一个真实的例子。文档非常稀疏。 最佳答案 如果您正在实时处理视频,并且您的输入是在像素缓冲区中处理的,则以下是如何将该
我已经阅读了我能找到的所有文档,但无法让简单的 vImage 调用起作用。我只需要一个真实的例子。文档非常稀疏。 最佳答案 如果您正在实时处理视频,并且您的输入是在像素缓冲区中处理的,则以下是如何将该
我正在尝试在我的代码中包含基于 vImage 的功能。但是编译失败——它甚至似乎根本无法识别函数/变量。 但与此同时,基于 vDSP 的代码似乎工作正常。此外,代码在模拟器中编译但在设备中失败。 示例
我正在尝试使用 iOS 上的 Accelerate 框架来绕过 iOS 上的 Core Image 不支持自定义过滤器/内核这一事实。我正在使用 Sobel kernel 的两个卷积开发边缘检测过滤器
我有一个函数,可以将 UIImage 转换为 vImage(用于 iOS 的 Accelerate 中的一些 vImage 方法.框架。 我的方法是: -(vImage_Buffer)convertI
我正在尝试将 CMSampleBuffer 从相机输出转换为 vImage,然后再进行一些处理。不幸的是,即使没有任何进一步的编辑,我从缓冲区获得的帧也有错误的颜色: 实现(不考虑内存管理和错误):
我正在尝试测试转换 Vuforia 生成的 YUV 图像并将它们转换为 UIImage 使用 iOS Accelerate Framework 的 vImage 调用的性能。在代码的当前状态下,我只是
我想知道如何在 Swift 中从文件或另一个图像容器对象(UIImage、CGImage)实例化 vImage 对象。关于这个主题的 Apple 文档似乎很少而且有点困惑。它似乎只需要一个基本的数据结
我有一个大图像 A 和另一个图像 B,它有一个我想粘贴到 A 中的 alpha channel 。我想在将它粘贴到 A 之前对 B 应用仿射变换。执行的步骤是什么这在 C++ 中使用 vImage 在
我是一名优秀的程序员,十分优秀!