标签: vimage

如何从vImage_Buffer转到CVPixelBufferRef

我正在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)

ios vimage

9
推荐指数
1
解决办法
1813
查看次数

在Swift中组合CGBitmapInfo和CGImageAlphaInfo

我正在将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中创建的最简单方法吗?

cocoa-touch objective-c ios swift vimage

9
推荐指数
2
解决办法
3005
查看次数

如何使用Accelerate Framework将iOS相机图像转换为灰度?

看起来这应该比我发现它更简单.

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

6
推荐指数
1
解决办法
3143
查看次数

iOS 使用 vImage - 加速将 QCAR YUV 转换为 RGB

我正在尝试测试转换 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)

uiimage ios accelerate-framework vuforia vimage

5
推荐指数
1
解决办法
2030
查看次数

使用vImageHistogramCalculation计算图像的直方图

我正在尝试使用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)

iphone macos ios accelerate-framework vimage

4
推荐指数
1
解决办法
1187
查看次数

iOS Accelerate Framework vImage - 性能改进?

我一直在使用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.

是否有一些技巧可以让这些功能更快?

opencv ios accelerate-framework vimage

4
推荐指数
3
解决办法
2107
查看次数

在 swift 中使用 vImageHistogramCalculation 计算图像的直方图

我正在尝试使用 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)

histogram ios accelerate-framework swift vimage

4
推荐指数
1
解决办法
3055
查看次数

如何投射UnsafeMutableRawPointer!到Swift 3.0或4.0中的UnsafeMutablePointer &lt;Float&gt;?

我正在为我的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)

ios accelerate-framework swift vimage unsafemutablepointer

3
推荐指数
1
解决办法
1079
查看次数

为什么我不能编译引用iPhone上的vImage库的代码?

我试图在我的代码中包含基于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.

iphone ios4 ios accelerate-framework vimage

2
推荐指数
1
解决办法
1255
查看次数

你如何从 CGColorSpace 获得 Unmanaged&lt;CGColorSpace&gt; ?

我正在用 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参数。

有没有另一种方法可以做到这一点?也许转换CGColorSpaceUnmanaged<CGColorSpace>?

core-graphics ios swift vimage

1
推荐指数
1
解决办法
758
查看次数