不久前我已经问过这个问题并且我也得到了很好的答案:
我一直在这个论坛上上下搜索,但找不到我想要的东西
真的需要。我想从相机获取原始图像数据。至目前为止
我试图从中获取 imageDataSampleBuffer 中的数据
方法
captureStillImageAsynchronouslyFromConnection:completionHandler: 和
将其写入 NSData 对象,但这不起作用。也许我在
错误的轨道,或者也许我只是做错了。我不想要的是
以任何方式压缩图像。
最简单的方法是使用 jpegStillImageNSDataRepresentation:来自
AVCaptureStillImageOutput,但就像我说的我不希望它成为
压缩的。
Thanks!
来自相机的原始图像数据 https://stackoverflow.com/questions/10698663/raw-image-data-from-camera
我以为我可以用这个,但我终于注意到我需要以与“645 PRO”中类似的方式更直接地获取原始图像数据。
645 PRO:RAW Redux http://jag.gr/2012/04/17/645-pro-raw-redux/
该网站上的图片显示他们在完成任何 jpeg 压缩之前获取原始数据。这就是我想做的。我的猜测是我需要转变imageDataSampleBuffer
但我没有找到一种方法可以在不压缩的情况下完全做到这一点。
“645 PRO”还将其图片保存为 TIFF,因此我认为它至少使用了一个额外的库。
我不想制作照片应用程序,但我需要最好的质量来检查图片中的某些功能。
Thanks!
Edit 1:因此,在尝试和搜索不同方向一段时间后,我决定提供状态更新。
该项目的最终目标是在 opencv 的帮助下检查图片中的某些特征。但在该应用程序能够在手机上执行此操作之前,我会尝试从手机中获取大部分未压缩的图片,以便在计算机上进行分析。
因此,我想保存“包含从相机返回的未压缩 BGRA 字节的 NSData 实例”,我可以使用 Brad Larson 的代码将其保存为 bmp 或 TIFF 文件。
正如我在评论中所说,我尝试使用 opencv 来实现此目的(无论如何都需要它)。但我能做的最好的事情就是把它变成一个带有以下函数的 UIImage计算机视觉讲座 http://computer-vision-talks.com/2012/06/opencv-tutorial-part-3/.
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另一个帖子 https://stackoverflow.com/questions/8714753/how-to-create-a-tiff-on-the-ipad。
但我找不到一种方法来做到这一点而不使用类似的东西UIImagePNGRepresentation
or UIImageJPEGRepresentation
.
现在我正在尝试使用 libtiff 做一些事情tutorial http://www.ibm.com/developerworks/linux/library/l-libtiff/.
也许有人有想法或知道一种更简单的方法将我的缓冲区对象转换为未压缩的图片。
再次提前致谢!
Edit 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 函数。这样,在拜尔偏振之后,我可以直接获得大约 30 MB 的 TIFF 文件!