Vuforia - захватить текущий видеокадр - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь получить видеокадр с Vuforia. Я нашел некоторый код в Интернете, но он не совсем работает. Я получаю изображения grayscale, distorted и duplicated. Также изображение действительно низкого разрешения - 120x67. Я могу работать с оттенками серого, но мне нужно нормальное изображение в большем разрешении без искажений. Я заметил, что я не могу установить

Vuforia::setFrameFormat(Vuforia::RGB888, true)

или к любому другому значению - возвращает false. Возможно я использую это в неправильном месте, я не уверен, когда я должен выполнить это. Я думаю, что формат, возвращаемый Vuforia :: Image, равен GRAYSCALE, и, вероятно, поэтому преобразование в UIImage также не работает. Вот ObjC оболочки, которые я использую для создания UIImage:

#import "VuforiaObjects.h"
#import <Vuforia/Renderer.h>
#import <Vuforia/Trackable.h>
#import <Vuforia/TrackableResult.h>
#import <Vuforia/Image.h>

@implementation VuforiaImage {
    const Vuforia::Image *_image;
}

- (instancetype)initWithImage:(const Vuforia::Image*)image {
    if(self = [super init]) {
        _image = image;
    }
    return self;
}

- (UIImage *)toUIImage {
    int width = self->_image->getWidth();
    int height = self->_image->getHeight();
    NSLog(@"%d x %d", width, height);
    int bitsPerComponent = 8;
    int bitsPerPixel = Vuforia::getBitsPerPixel(Vuforia::RGB888);
    int bytesPerRow = self->_image->getBufferWidth() * bitsPerPixel / bitsPerComponent;
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaNone;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, self->_image->getPixels(), Vuforia::getBufferSize(width, height, Vuforia::RGB888), NULL);

    CGImageRef imageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
    UIImage *result = [UIImage imageWithCGImage:imageRef];

    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpaceRef);
    CGImageRelease(imageRef);

    return result;
}

@end

@implementation VuforiaFrame {
    Vuforia::Frame _frame;
}

- (instancetype)initWithFrame:(Vuforia::Frame)frame {
    if(self = [super init]) {
        _frame = frame;
    }
    return self;
}

- (VuforiaImage *)image:(int)index {
    return [[VuforiaImage alloc] initWithImage:_frame.getImage(index)];
}

@end

И вот как это выглядит (маленький UIImageView показывает сгенерированное изображение): enter image description here

...