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