ベースアドレスデータからコピーせずにデータプロバイダを作成し、このデータプロバイダからUIImageを作成することができます。このイメージを参照している間にバッファの再利用を避けるには、サンプルバッファとロックベースアドレスを保持する必要があります。私はこのプロジェクトhttps://github.com/k06a/UIImage-DecompressAndMap/blob/master/UIImage%2BDecompressAndMap.mからimageFromData
を持って、それを少し採択しました
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
// Retain sample buffer and lock base address
CFRetain(sampleBuffer);
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer, 0);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
void *baseAddress = (void *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);
UIImage *image = imageFromData(baseAddress, width, height, bytesPerRow, sampleBuffer);
// Now you can store this UIImage as long as you want
}
:
UIImage *imageFromData(void *data, size_t width, size_t height, size_t bytesPerRow, CMSampleBufferRef sampleBuffer)
{
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGDataProviderRef provider = CGDataProviderCreateWithData((void *)sampleBuffer, data, bytesPerRow * height, munmap_wrapper);
CGImageRef inflatedImage = CGImageCreate(width, height, 8, 4*8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, provider, NULL, NO, kCGRenderingIntentDefault);
CGColorSpaceRelease(colorSpace);
CGDataProviderRelease(provider);
UIImage *img = [UIImage imageWithCGImage:inflatedImage scale:scale orientation:UIImageOrientationUp];
CGImageRelease(inflatedImage);
return img;
}
はまた、提供する必要があります彼らはロックを解除し、このイメージオブジェクトを忘れてしまう時に自動的に解放されなければなりませんunlock_function
:
void unlock_function(void *info, const void *data, size_t size)
{
// Unlock base address release sample buffer
CMSampleBufferRef sampleBuffer = (CMSampleBufferRef)info;
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
CFRelease(sampleBuffer);
}
こんにちはハンマー、どのようにしてcv :: Mat画像をOpenGL ESにレンダリングしますか?少し早いですがお礼を – lilouch