Некоторое время назад я уже задавал этот вопрос, и я также получил хороший ответ:
Я облазил этот форум вдоль и поперек, но не нашел того, что мне действительно нужно. Я хочу получить необработанные данные изображения с камеры. До сих пор я пытался получить данные из imageDataSampleBuffer с помощью этого метода captureStillImageAsynchronouslyFromConnection:completionHandler: и записать их в объект NSData, но это не сработало. Может быть, я на неправильном пути, или, может быть, я просто делаю это неправильно. Чего я не хочу, так это чтобы изображение было сжато каким-либо образом.
Самый простой способ — использовать jpegStillImageNSDataRepresentation: from AVCaptureStillImageOutput, но, как я уже сказал, я не хочу, чтобы он был сжат.
Спасибо!
Необработанные данные изображения с камеры
Я думал, что смогу работать с этим, но, наконец, я заметил, что мне нужно получать необработанные данные изображения более непосредственно, подобно тому, как это делается в «645 PRO».
Изображения на этом сайте показывают, что они получают необработанные данные до того, как будет выполнено какое-либо сжатие 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 МБ сразу после поляризации Бейера!