少し前に、私はすでにこの質問をしましたが、良い答えも得ました:
このフォーラムを上下に検索してきましたが、本当に必要なものが見つかりませんでした。カメラから生の画像データを取得したい。今まで、そのメソッド captureStillImageAsynchronouslyFromConnection:completionHandler: から imageDataSampleBuffer からデータを取得して、それを NSData オブジェクトに書き込もうとしましたが、うまくいきませんでした。たぶん、私は間違った道を進んでいるのかもしれませんし、単にやり方が間違っているだけかもしれません。私が望んでいないのは、画像が何らかの方法で圧縮されることです。
簡単な方法は、AVCaptureStillImageOutput から jpegStillImageNSDataRepresentation: を使用することですが、私が言ったように、圧縮したくありません。
ありがとう!
これでなんとかなると思っていたのですが、「645 PRO」と同じように生の画像データをもっと直接的に取得する必要があることに気付きました。
そのサイトの写真は、jpeg 圧縮が行われる前に生データを取得していることを示しています。それが私がやりたいことです。私の推測では、変換する必要がありますimageDataSampleBuffer
が、圧縮なしで完全に変換する方法はありません。「645 PRO」は画像もTIFFで保存するので、少なくとも1つの追加ライブラリを使用していると思います。
写真アプリを作りたいわけではありませんが、写真の特定の機能をチェックできる最高の品質が必要です。
ありがとう!
編集 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 - アプローチ
私が試したもう1つのことは、別の投稿で提案されているように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 の直後に約 30 MB の TIFF ファイルを取得できます。