前一段时间我已经问过这个问题,并且我也得到了很好的答案:
Raw image data from camera
我以为可以解决这个问题,但是最后我注意到,我需要以与“645 PRO”中类似的方式更直接地获取原始图像数据。
645 PRO: RAW Redux
该站点上的图片显示,在完成任何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-方法
我尝试的另一件事是按照another post中的建议使用ImageMagick。
但是如果不使用
UIImagePNGRepresentation
或UIImageJPEGRepresentation
之类的方法,我将找不到解决方法。现在,我正在尝试使用tutorial对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文件!
最佳答案
哇,那篇博客文章很特别。大量的话只是说明它们得到了Apple从静止图像返回给您的样本缓冲区字节。他们的方法没有什么特别创新的,而且我知道许多相机应用程序都可以做到这一点。
您可以使用以下代码获取从AVCaptureStillImageOutput拍摄的照片返回的原始字节:
[photoOutput captureStillImageAsynchronouslyFromConnection:[[photoOutput connections] objectAtIndex:0] completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) {
CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(imageSampleBuffer);
CVPixelBufferLockBaseAddress(cameraFrame, 0);
GLubyte *rawImageBytes = CVPixelBufferGetBaseAddress(cameraFrame);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(cameraFrame);
NSData *dataForRawBytes = [NSData dataWithBytes:rawImageBytes length:bytesPerRow * CVPixelBufferGetHeight(cameraFrame)];
// Do whatever with your bytes
CVPixelBufferUnlockBaseAddress(cameraFrame, 0);
}];
这将为您提供一个NSData实例,其中包含从相机返回的未压缩BGRA字节。您可以将它们保存到磁盘或对它们进行任何操作。如果您真的需要处理字节本身,则可以避免创建NSData的开销,而只需使用像素缓冲区中的字节数组即可。