Необработанные данные изображения с камеры, такие как «645 PRO»

Когда-то я уже задавал этот вопрос и тоже получил хороший ответ:

I've been searching this forum up and down but I couldn't find what I really need. I want to get raw image data from the camera. Up till now I tried to get the data out of the imageDataSampleBuffer from that method captureStillImageAsynchronouslyFromConnection:completionHandler: and to write it to an NSData object, but that didn't work. Maybe I'm on the wrong track or maybe I'm just doing it wrong. What I don't want is for the image to be compressed in any way.

The easy way is to use jpegStillImageNSDataRepresentation: from AVCaptureStillImageOutput, but like I said I don't want it to be compressed.

Thanks!

Необработанные данные изображения с камеры

Я думал, что смогу работать с этим, но, наконец, я заметил, что мне нужно получать необработанные данные изображения более непосредственно, подобно тому, как это делается в «645 PRO».

645 PRO :RAW Редукс

Изображения на этом сайте показывают, что они получают необработанные данные до того, как будет выполнено какое-либо сжатие jpeg. Это то, что я хочу сделать. Я предполагаю, что мне нужно преобразовать imageDataSampleBuffer, но я не вижу способа сделать это полностью без сжатия. "645 PRO" также сохраняет свои изображения в формате TIFF, поэтому я думаю, что он использует как минимум одну дополнительную библиотеку.

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

Спасибо!

Редактировать 1: Итак, попробовав некоторое время в разных направлениях, я решил обновить статус.

Конечная цель этого проекта — проверить определенные функции на картинке, что произойдет с помощью opencv. Но пока приложение не сможет сделать это на телефоне, я пытаюсь получить в основном несжатые изображения с телефона, чтобы проанализировать их на компьютере.

Поэтому я хочу сохранить «экземпляр NSData, содержащий несжатые байты BGRA, возвращенные с камеры», который я могу получить с помощью кода Брэда Ларсона в виде файла bmp или TIFF. Как я сказал в комментарии, я пытался использовать для этого opencv (, он все равно понадобится ). Но лучшее, что я мог сделать, это превратить его в UIImage с функцией Computer Vision Talks .

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 МБ сразу после поляризации Бейера -!

12
задан Community 23 May 2017 в 12:32
поделиться