【问题标题】:How to use UIImage with ARToolKitPlus? (UIImage to CVImageBufferRef conversion)如何将 UIImage 与 ARToolKitPlus 一起使用? (UIImage 到 CVImageBufferRef 的转换)
【发布时间】:2011-07-10 11:10:16
【问题描述】:

我有两种算法可以检测 AR 标记(ARToolKit 和 Infi)。我让他们在 iPhone 上实时检测标记。在这个阶段,我想比较它们的速度和准确性。我想准备一系列图像并测试它们的识别。 我可以用 infi 做到这一点,但我无法设法将 ARToolKit 与 UIImage 一起使用。

ARToolKit 使用 CVImageBuffer 来识别标记:

- (Marker *)detectMarkerInImageBuffer:(CVImageBufferRef)imageBuffer {

    /*We lock the buffer and get the address of the first pixel*/
    CVPixelBufferLockBaseAddress(imageBuffer,0);
    unsigned char *baseAddress = (unsigned char *) CVPixelBufferGetBaseAddress(imageBuffer);
    tracker->calc(baseAddress);

如何使用/转换 UIImage 来实现 baseAddress,以便将其发送到 tracker->calc ?

使用 infi 我首先从缓冲区创建 IplImage 或将 UIImage 转换为 IplImage,然后在这两种情况下:

Buffer* buffer = new Buffer();

buffer->setBuffer( (unsigned char *) iplImg->imageData, iplImg->width, iplImg->height);

【问题讨论】:

    标签: iphone opencv uiimage augmented-reality buffering


    【解决方案1】:

    我在这里找到了答案:How do I export UIImage array as a movie?

    这就是我要找的东西

    - (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image
    {
        NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
            [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
            [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
            nil];
        CVPixelBufferRef pxbuffer = NULL;
        CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, frameSize.width,
            frameSize.height, kCVPixelFormatType_32ARGB, (CFDictionaryRef) options, 
            &pxbuffer);
        NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);
    
        CVPixelBufferLockBaseAddress(pxbuffer, 0);
        void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
        NSParameterAssert(pxdata != NULL);
    
        CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
        CGContextRef context = CGBitmapContextCreate(pxdata, frameSize.width,
            frameSize.height, 8, 4*frameSize.width, rgbColorSpace, 
            kCGImageAlphaNoneSkipFirst);
        NSParameterAssert(context);
        CGContextConcatCTM(context, frameTransform);
        CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), 
            CGImageGetHeight(image)), image);
        CGColorSpaceRelease(rgbColorSpace);
        CGContextRelease(context);
    
        CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
    
        return pxbuffer;
    }
    

    【讨论】:

    • 谢谢,但frameSize 似乎未定义。 frameSize == UIImage(CGImage:image).size 吗?
    猜你喜欢
    • 2011-03-10
    • 2011-12-29
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2011-07-25
    • 2015-06-13
    • 2015-06-05
    • 1970-01-01
    相关资源
    最近更新 更多