来自相机的原始图像数据,如"645 PRO"

tho*_*ler 12 camera opencv image imagemagick ios

前段时间我已经问了这个问题,我也得到了一个很好的答案:

我一直在搜索这个论坛,但我找不到我真正需要的东西.我想从相机获取原始图像数据.到现在为止我试图让数据从imageDataSampleBuffer从方法captureStillImageAsynchronouslyFromConnection的:completionHandler:并将其写入到一个NSData对象,但没有奏效.也许我走错了路线或者说我做错了.我不想要的是以任何方式压缩图像.

简单的方法是使用jpegStillImageNSDataRepresentation:来自AVCaptureStillImageOutput,但就像我说的我不希望它被压缩.

谢谢!

来自相机的原始图像数据

我以为我可以使用它,但我终于注意到我需要以与"645 PRO"中类似的方式更直接地获取原始图像数据.

645 PRO:RAW Redux

该站点上的图片显示他们在任何jpeg压缩完成之前获取原始数据.这就是我想要做的.我的猜测是我需要转换,imageDataSampleBuffer但我没有看到完全没有压缩的方法."645 PRO"还将其图片保存在TIFF中,因此我认为它至少使用了一个额外的库.

我不想制作照片应用,但我需要最好的质量来检查图片中的某些功能.

谢谢!

编辑1: 因此,在尝试并在不同方向搜索一段时间后,我决定进行状态更新.

该项目的最终目标是检查图片中的某些功能,这些功能将在opencv的帮助下发生.但是,直到该应用程序能够在手机上进行,我试图从手机中获取大部分未压缩的图片,以便在计算机上进行分析.

因此,我想保存"包含从相机返回的未压缩BGRA字节的NSData实例",我可以使用Brad Larson的代码作为bmp或TIFF文件.正如我在评论中所说,我尝试使用opencv(无论如何都需要它).但我能做的最好的事情就是将它变成一个具有计算机视觉会谈功能的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
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

我只需要使用opencv中的imwrite函数.这样我在beyer-Polarization之后直接得到大约30 MB的TIFF文件!

Bra*_*son 16

哇,这篇博文很特别.很多单词只是声明他们得到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);
}];
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个NSData实例,其中包含从相机返回的未压缩BGRA字节.您可以将这些保存到磁盘或使用它们执行任何操作.如果你真的需要自己处理字节,我会避免创建NSData的开销,只需使用像素缓冲区中的字节数组.


tho*_*ler 5

我可以用OpenCV来解决它.感谢所有帮助过我的人.

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.BMP", picNum]];
const char* cPath = [filePath cStringUsingEncoding:NSMacOSRomanStringEncoding];

const cv::string newPaths = (const cv::string)cPath;

cv::imwrite(newPaths, frame);
Run Code Online (Sandbox Code Playgroud)

我只需要使用opencv中的imwrite函数.这样我在拜耳过滤器后直接获得大约24 MB的BMP文件!