Некоторое время назад я уже задавал этот вопрос, и у меня также был хороший ответ:
Я искал этот форум вверх и вниз, но я не мог найти то, что я очень нужно. Я хочу получить необработанные данные изображения с камеры. До сих пор Я попытался извлечь данные из imageDataSampleBuffer из этого метод captureStillImageAsynchronouslyFromConnection: completeHandler: и записать его в объект NSData, но это не сработало. Может быть, я нахожусь неправильный трек или, может быть, я просто делаю это неправильно. Я не хочу, чтобы для сжатия изображения каким-либо образом.
Простым способом является использование jpegStillImageNSDataRepresentation: from AVCaptureStillImageOutput, но, как я уже сказал, я не хочу, чтобы это было сжатый.
Спасибо!
Исходные данные изображения с камеры
Я думал, что смогу с этим справиться, но я, наконец, заметил, что мне нужно получить данные необработанного изображения более точно так же, как это сделано в "645 PRO".
Изображения на этом сайте показывают, что они получают необработанные данные перед выполнением любого jpeg-сжатия. Это то, что я хочу сделать. Я предполагаю, что мне нужно преобразовать imageDataSampleBuffer
, но я не вижу способа сделать это полностью без сжатия.
"645 PRO" также сохраняет свои снимки в TIFF, поэтому я думаю, что он использует хотя бы одну дополнительную библиотеку.
Я не хочу делать фотоприложение, но мне нужно лучшее качество, которое я могу проверить для некоторых функций на картинке.
Спасибо!
Изменить 1: Поэтому после попытки и поиска в разных направлениях какое-то время я решил дать обновление статуса.
Конечной целью этого проекта является проверка определенных функций на картинке, которая будет происходить с помощью opencv. Но пока приложение не сможет сделать это по телефону, я пытаюсь получить в основном несжатые картинки из телефона, чтобы проанализировать их на компьютере.
Поэтому я хочу сохранить "экземпляр NSData, содержащий несжатые байты BGRA, возвращенные с камеры". Я могу получить код Брэда Ларсона в формате BMP или TIFF. Как я уже сказал в комментарии, я попытался использовать opencv для этого (в любом случае это будет необходимо). Но лучшее, что я мог сделать, это превратить его в UIImage с функцией "Обсуждение компьютерного зрения" .
void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
cv::Mat frame(height, width, CV_8UC4, (void*)baseAddress);
UIImage *testImag = [UIImage imageWithMat:frame andImageOrientation:UIImageOrientationUp];
//imageWithMat... being the function from Computer Vision Talks which I can post if someone wants to see it
ImageMagick - Подход
Еще одна вещь, которую я пробовал, - использовать ImageMagick, как было предложено в другом сообщении.
Но я не мог найти способ сделать это, не используя что-то вроде UIImagePNGRepresentation
или UIImageJPEGRepresentation
.
На данный момент я пытаюсь сделать что-то с libtiff, используя этот учебник.
Возможно, у кого-то есть идея или он знает гораздо более простой способ конвертировать мой буферный объект в несжатое изображение. Спасибо заранее!
Изменить 2:
Я что-то нашел! И я должен сказать, что я был очень слеп.
void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
cv::Mat frame(height, width, CV_8UC4, (void*)baseAddress);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"ocv%d.TIFF", picNum]];
const char* cPath = [filePath cStringUsingEncoding:NSMacOSRomanStringEncoding];
const cv::string newPaths = (const cv::string)cPath;
cv::imwrite(newPaths, frame);
Мне просто нужно использовать функцию imwrite из opencv. Таким образом, я получаю файлы TIFF около 30 МБ непосредственно после поляризации бейера!