iOS'ta 120 fps'de gerçek zamanlı video işleme yapıyorum ve GPU'daki ilk ön işlem görüntüsünü istiyorum (örneğin, dönüştürmeme rengi vb.) OpenCV kullanarak CPU üzerinde daha hızlı işlemci ve daha sonra işlem sonrası çerçeve.GPU (metal) ve CPU (OpenCV) üzerindeki kamera besleme verilerini iPhone
Fotoğraf makinesi beslemesini GPU ve CPU arasında Metal kullanarak paylaşmanın en hızlı yolu nedir? gibi
Başka bir deyişle boru görünecektir: Ben CMSampleBufferRef dönüştürme ediyorum
CMSampleBufferRef -> MTLTexture or MTLBuffer -> OpenCV Mat
- benim metal gölgelendirici ben OpenCV için MTLTexture dönüştürmek finised sonra> Aşağıdaki şekilde
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
// textureRGBA
{
size_t width = CVPixelBufferGetWidth(pixelBuffer);
size_t height = CVPixelBufferGetHeight(pixelBuffer);
MTLPixelFormat pixelFormat = MTLPixelFormatBGRA8Unorm;
CVMetalTextureRef texture = NULL;
CVReturn status = CVMetalTextureCacheCreateTextureFromImage(NULL, _textureCache, pixelBuffer, NULL, pixelFormat, width, height, 0, &texture);
if(status == kCVReturnSuccess) {
textureBGRA = CVMetalTextureGetTexture(texture);
CFRelease(texture);
}
}
MTLTexture
cv::Mat image;
...
CGSize imageSize = CGSizeMake(drawable.texture.width, drawable.texture.height);
int imageByteCount = int(imageSize.width * imageSize.height * 4);
int mbytesPerRow = 4 * int(imageSize.width);
MTLRegion region = MTLRegionMake2D(0, 0, int(imageSize.width), int(imageSize.height));
CGSize resSize = CGSizeMake(drawable.texture.width, drawable.texture.height);
[drawable.texture getBytes:image.data bytesPerRow:mbytesPerRow fromRegion:region mipmapLevel:0];
Bazı gözlemler:?
1) Ne yazık ki MTLTexture.getBytes
CPU'ya GPU dan pahalı (veri kopyalamayı görünüyor) ve bazı insanlar fark) çok fazla ~ 100fps
2'de işliyor iphone'umda 5S üzerinde 5ms sürer aşağıdaki yöntem ile yerine MTLTexture arasında MTLBuffer kullanımı: metalDevice.newBufferWithLength(byteCount, options: .StorageModeShared)
(bakınız: Memory write performance - GPU CPU Shared Memory)
Ancak CMSampleBufferRef
ve CVPixelBufferRef
birlikte CoreVideo tarafından yönetilen tahmindir edilir.
Tüm çözünürlükler için GPU desteklenmiyor. Biliyorum, cevabın değil. GPU hakkında bir bilgi verdim. –
GPUImage'ı denediniz https://github.com/BradLarson/GPUImage –
GPUImage'ı denedim ancak en büyük sorun GPU'dan CPU'ya veri aktarıyor. GPUImage, OpenGL'i iyi ve tersi durumda kullanır, Metal API'nin paylaşımlı belleği olamaz. – pzo