我正在iOS应用中录制实时视频.在另一个StackOverflow页面(链接)上,我发现你可以使用vImage_Buffer来处理我的帧.
问题是我不知道如何从输出的vImage_buffer返回CVPixelBufferRef.
以下是另一篇文章中给出的代码:
NSInteger cropX0 = 100,
cropY0 = 100,
cropHeight = 100,
cropWidth = 100,
outWidth = 480,
outHeight = 480;
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0);
void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
vImage_Buffer inBuff;
inBuff.height = cropHeight;
inBuff.width = cropWidth;
inBuff.rowBytes = bytesPerRow;
int startpos = cropY0*bytesPerRow+4*cropX0;
inBuff.data = baseAddress+startpos;
unsigned char *outImg= (unsigned char*)malloc(4*outWidth*outHeight);
vImage_Buffer outBuff = {outImg, outHeight, outWidth, 4*outWidth};
vImage_Error err = vImageScale_ARGB8888(&inBuff, &outBuff, NULL, 0);
if (err != kvImageNoError) NSLog(@" error …Run Code Online (Sandbox Code Playgroud) 我正在将Apple的UIImageEffects示例代码从Objective-C 重写为Swift,我对以下行有一个疑问:
vImage_CGImageFormat format = {
.bitsPerComponent = 8,
.bitsPerPixel = 32,
.colorSpace = NULL,
.bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little,
.version = 0,
.decode = NULL,
.renderingIntent = kCGRenderingIntentDefault
};
Run Code Online (Sandbox Code Playgroud)
这是我在Swift中的版本:
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue | CGBitmapInfo.ByteOrder32Little.rawValue)
let format = vImage_CGImageFormat(bitsPerComponent: 8, bitsPerPixel: 32, colorSpace: nil, bitmapInfo: bitmapInfo, version: 0, decode: nil, renderingIntent: .RenderingIntentDefault)
Run Code Online (Sandbox Code Playgroud)
这是bitmapInfo在Swift中创建的最简单方法吗?
看起来这应该比我发现它更简单.
我AVFoundation在标准委托方法中有一个框架:
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
Run Code Online (Sandbox Code Playgroud)
我想在哪里使用Accelerate.Framework.将帧转换为灰度.
框架中有一系列转换方法,包括vImageConvert_RGBA8888toPlanar8(),看起来它可能是我想看到的,但是,我找不到任何如何使用它们的示例!
到目前为止,我有代码:
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
@autoreleasepool {
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
/*Lock the image buffer*/
CVPixelBufferLockBaseAddress(imageBuffer,0);
/*Get information about the image*/
uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
size_t stride = CVPixelBufferGetBytesPerRow(imageBuffer);
// vImage In
Pixel_8 *bitmap = (Pixel_8 *)malloc(width * height * sizeof(Pixel_8));
const vImage_Buffer inImage = { bitmap, height, width, stride };
//How …Run Code Online (Sandbox Code Playgroud) iphone image-processing objective-c accelerate-framework vimage
我正在尝试测试转换 Vuforia 生成的 YUV 图像并将它们转换为UIImage使用 iOS Accelerate Framework 的 vImage 调用的性能。在代码的当前状态下,我只是想让它工作。现在转换会产生暗条纹图像。是否有任何关于 Vuforia 如何在其实现中布置 YUV 格式的已发布详细信息?我最初的假设是他们使用 iOS 设备使用的双平面 420p 格式。相关测试代码如下。
UIImage *imageWithQCARCameraImage(const QCAR::Image *cameraImage)
{
UIImage *image = nil;
if (cameraImage) {
QCAR::PIXEL_FORMAT pixelFormat = cameraImage->getFormat();
CGColorSpaceRef colorSpace = NULL;
switch (pixelFormat) {
case QCAR::YUV:
case QCAR::RGB888:
colorSpace = CGColorSpaceCreateDeviceRGB();
break;
case QCAR::GRAYSCALE:
colorSpace = CGColorSpaceCreateDeviceGray();
break;
case QCAR::RGB565:
case QCAR::RGBA8888:
case QCAR::INDEXED:
std::cerr << "Image format conversion not implemented." << std::endl;
break;
case QCAR::UNKNOWN_FORMAT:
std::cerr << "Image format …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用vImage来计算图像的直方图vImageHistogramCalculation_ARGBFFFF,但我得到了一个vImage_Error类型kvImageNullPointerArgument(错误代码为-21772).
这是我的代码:
- (void)histogramForImage:(UIImage *)image {
//setup inBuffer
vImage_Buffer inBuffer;
//Get CGImage from UIImage
CGImageRef img = image.CGImage;
//create vImage_Buffer with data from CGImageRef
CGDataProviderRef inProvider = CGImageGetDataProvider(img);
CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
//The next three lines set up the inBuffer object
inBuffer.width = CGImageGetWidth(img);
inBuffer.height = CGImageGetHeight(img);
inBuffer.rowBytes = CGImageGetBytesPerRow(img);
//This sets the pointer to the data for the inBuffer object
inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
//Prepare the parameters to pass to vImageHistogramCalculation_ARGBFFFF
vImagePixelCount *histogram[4] = …Run Code Online (Sandbox Code Playgroud) 我一直在使用OpenCV和Apple的Accelerate框架,发现Accelerate的性能很慢,Apple的文档有限.我们举个例子:
void equalizeHistogram(const cv::Mat &planar8Image, cv::Mat &equalizedImage)
{
cv::Size size = planar8Image.size();
vImage_Buffer planarImageBuffer = {
.width = static_cast<vImagePixelCount>(size.width),
.height = static_cast<vImagePixelCount>(size.height),
.rowBytes = planar8Image.step,
.data = planar8Image.data
};
vImage_Buffer equalizedImageBuffer = {
.width = static_cast<vImagePixelCount>(size.width),
.height = static_cast<vImagePixelCount>(size.height),
.rowBytes = equalizedImage.step,
.data = equalizedImage.data
};
TIME_START(VIMAGE_EQUALIZE_HISTOGRAM);
vImage_Error error = vImageEqualization_Planar8(&planarImageBuffer, &equalizedImageBuffer, kvImageNoFlags);
TIME_END(VIMAGE_EQUALIZE_HISTOGRAM);
if (error != kvImageNoError) {
NSLog(@"%s, vImage error %zd", __PRETTY_FUNCTION__, error);
}
}
Run Code Online (Sandbox Code Playgroud)
此调用大约需要20ms.这具有在我的应用程序中无法使用的实际意义.也许直方图的均衡本质上很慢,但我也测试了BGRA->灰度,发现OpenCV可以在~5ms内完成,vImage需要~20ms.
在测试其他功能时,我发现了一个项目,该项目创建了一个带有模糊功能(gist)的简单滑块应用程序,我将其清理干净以进行测试.大约~20ms.
是否有一些技巧可以让这些功能更快?
我正在尝试使用 AcceleratevImageHistogramCalculation_ARGBFFFF函数计算图像的直方图,但我得到了一个vImage_Error类型kvImageNullPointerArgument(错误代码是-21772)。
这是完全相同的问题,但我在 Swift 中工作:使用 vImageHistogramCalculation 计算图像的直方图
// Get CGImage from UIImage
var image:UIImage = UIImage(named: "happiness1")!
var img:CGImageRef = image.CGImage
// Create vImage_Buffer with data from CGImageRef
var inProvider:CGDataProviderRef = CGImageGetDataProvider(img)
var inBitmapData:CFDataRef = CGDataProviderCopyData(inProvider)
// The next three lines set up the inBuffer object
var height:vImagePixelCount = CGImageGetHeight(img)
var width:vImagePixelCount = CGImageGetWidth(img)
var rowBytes:UInt = CGImageGetBytesPerRow(img)
var data:UnsafePointer<Void> = UnsafePointer<Void>(CFDataGetBytePtr(inBitmapData))
// Setup inBuffer
var inBuffer = vImage_Buffer(data: &data, height: …Run Code Online (Sandbox Code Playgroud) 我正在为我的iOS应用程序使用Accelerate库。几年前,我在Swift 2.0中构建了这个应用程序,并且运行良好。现在,Swift已更新为3.0和4.0,我必须将大多数代码转换为当前语法。我已经运行了转换器,但是仍然有一些语法错误。这是我最难解决的问题。我似乎找不到一种相当简洁的方法来修复它。
我对图像进行了基本的算术运算。这是其中之一:
public func add(_ left: Image, right: Image) -> Image! {
let results = Image.init(rows: left.size.rows, columns: left.size.columns, pixelSize: left.pixelSize)
let leftOperand = UnsafeMutablePointer<Float>(left.buffer.data)
let rightOperand = UnsafeMutablePointer<Float>(right.buffer.data)
let destination = UnsafeMutablePointer<Float>(results.buffer.data)
vDSP_vadd(leftOperand, 1, rightOperand, 1, destination, 1, UInt(left.lengthOfBuffer))
return results
}
Run Code Online (Sandbox Code Playgroud)
该类Image的字段buffer为a vImage_Buffer,其定义如下:
open class Image {
open var buffer: vImage_Buffer
....}
Run Code Online (Sandbox Code Playgroud)
问题:
调用buffer.data返回的类型为UnsafeMutableRawPointer!。该vDSP_add功能需要UnsafeMutablePointer<Float>其参数。我曾经能够立即将其投射到UnsafeMutablePointer<Float>对象上。看起来现在不推荐使用初始化程序。因此,在类似的代码上let leftOperand = UnsafeMutablePointer<Float>(left.buffer.data),我得到了这个错误
Cannot invoke initializer …Run Code Online (Sandbox Code Playgroud) 我试图在我的代码中包含基于vImage的功能.但编译失败 - 它甚至似乎根本无法识别函数/变量.
但同时基于vDSP的代码似乎运行良好.此外,代码在模拟器中编译但在设备中失败.
示例代码(失败)如下
#import "test.h"
#include <Accelerate/Accelerate.h>
@implementation test
-(void) test1{
DSPComplex d ={1.0, 2.0};
d;
vImagePixelCount x = 3;
x;
}
@end
Run Code Online (Sandbox Code Playgroud)
在这里,DSPComplex是基于DSP的代码,在同一框架中 - 工作正常,而vImagePixelCount - 这是基于vImage的代码 - 它失败了.谁可以帮我这个事?iOS4中不包含vImage吗?
我在设备中使用iOS4.2.
我正在用 Swift 编写一个函数,它vImage_CGImageFormat从 a创建 aCGImage如下:
vImage_CGImageFormat(
bitsPerComponent: UInt32(CGImageGetBitsPerComponent(image)),
bitsPerPixel: UInt32(CGImageGetBitsPerPixel(image)),
colorSpace: CGImageGetColorSpace(image),
bitmapInfo: CGImageGetBitmapInfo(image),
version: UInt32(0),
decode: CGImageGetDecode(image),
renderingIntent: CGImageGetRenderingIntent(image))
Run Code Online (Sandbox Code Playgroud)
然而,这不会编译。这是因为CGImageGetColorSpace(image)回报CGColorSpace!与上述构造只需要Unmanaged<CGColorSpace>为colorSpace参数。
有没有另一种方法可以做到这一点?也许转换CGColorSpace成Unmanaged<CGColorSpace>?