以前我已经问过这个问题,并且我也得到了一个好答案:
我在这个论坛上搜索了很久,但是我没有找到我真正需要的东西。我想从相机中获取原始图像数据。到目前为止,我试图从captureStillImageAsynchronouslyFromConnection:completionHandler:方法中的imageDataSampleBuffer中获取数据,并将其写入NSData对象,但那行不通。也许我走错了路,或者我只是做错了。我不希望图像以任何方式被压缩。
简单的方法是使用AVCaptureStillImageOutput中的jpegStillImageNSDataRepresentation:,但是像我说的,我不希望它被压缩。
谢谢!
我以为我可以用它来工作,但最终我注意到我需要以类似于“645 PRO”中所做的方式更直接地获取原始图像数据。
该网站上的图片显示他们在进行任何jpeg压缩之前获得了原始数据。这就是我想要做的。我的猜想是我需要转换imageDataSampleBuffer,但是我没有看到完全不压缩它的方法。 “645 PRO”还将其图片保存为TIFF,因此我认为它使用了至少一个其他库。
我不想制作照片应用程序,但我需要最好的质量来检查图片中的某些特征。
谢谢!
编辑1: 所以经过一段时间的尝试和搜索不同方向,我决定进行状态更新。
该项目的最终目标是检查图片中的某些特征,这将在opencv的帮助下完成。但在应用程序能够在手机上执行之前,我正在尝试从手机中获取大多未压缩的图像以在计算机上分析它们。
因此,我想将Brad Larson代码获得的“包含来自相机的未压缩BGRA字节的NSData实例”保存为bmp或TIFF文件。正如我在评论中所说,我尝试使用opencv进行此操作(无论如何都会需要),但我最好的成果是使用Computer Vision Talks中的函数将其转换为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);
我只需要使用OpenCV的imwrite函数即可。这样,在进行Beyer-Polarisation后,我就可以直接得到大约30MB的TIFF文件!