Я пытаюсь получить видеокадр с 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](https://i.stack.imgur.com/Fdb76.png)