Доступ к камере iPhone с двумя библиотеками в одном приложении - PullRequest
1 голос
/ 29 ноября 2011

Мое приложение для iOS должно одновременно выполнять следующие две задачи:

  1. сканирование на наличие QR-тегов с использованием ZBar SDK,
  2. сканирование маркеров дополненной реальности с использованием QCAR SDK.

Или другими словами: я ищу QR-теги, окруженные маркером AR.

Обе задачи должны выполняться в режиме реального времени. Мой первый наивный подход показал, что объединение обоих SDK в одном приложении приведет к тому, что SDK, инициализированный первым, перестанет работать при инициализации второго SDK.

У кого-нибудь есть предложения? Спасибо.

Ответы [ 2 ]

6 голосов
/ 05 декабря 2011

Мне удалось это сделать. Если кому-то нравится знать:

QCAR работает только с полным доступом к камере. Следовательно, он должен быть инициализирован и запущен, как показано в документации. К счастью, он обеспечивает доступ к обработанному изображению с камеры в виде необработанных данных RGB. Я использовал этот код для преобразования необработанных данных в UIImage:

QCAR::setFrameFormat(QCAR::GRAYSCALE, true);
const QCAR::Image *image = state.getFrame().getImage(1); // 0: YUV, 1: Grayscale image
const char *data = (const char *)image->getPixels();
int width = image->getWidth(); int height = image->getHeight();

CGColorSpace *colorSpace = CGColorSpaceCreateDeviceGray();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGDataProvider *provider = CGDataProviderCreateWithData(NULL, data, width*height, NULL);
CGColorRenderingIntent intent = kCGRenderingIntentDefault;
CGImageRef imageRef = CGImageCreate(width, height, 8, 8, width * 1, colorSpace, bitmapInfo, provider, NULL, NO, intent);
myUIImage = [UIImage imageWithCGImage:imageRef];

Теперь вы можете использовать класс ZBar ZBarImageScanner следующим образом:

ZBarImageScanner *imageScanner = [[ZBarImageScanner alloc] init];
ZBarImage *image = [[ZBarImage alloc] initWithCGImage:myUIImage.CGImage];
int result = [imageScanner scanImage:image];

if (result > 0) {
 ZBarSymbolSet *symbols = imageScanner.results;
 for(ZBarSymbol *symbol in symbols) {
  NSLog(@"%@", symbol.data);
 }
}
0 голосов
/ 29 ноября 2011

Одновременно может быть запущен только один сеанс камеры, поэтому вам нужно выяснить, как заставить ZBar и QCar использовать один и тот же.

...