मैं 120 एफपीएस पर आईओएस पर रीयलटाइम वीडियो प्रोसेसिंग कर रहा हूं और जीपीयू (डाउनसमूल, कन्वर्ट कलर इत्यादि) पर प्रीप्रोसेस इमेज करना चाहता हूं। सीपीयू पर पर्याप्त तेज़) और बाद में ओपनसीवी का उपयोग कर सीपीयू पर पोस्टप्रोसेस फ्रेम।आईफोन पर जीपीयू (धातु) और सीपीयू (ओपनसीवी) पर कैमरा फीड डेटा प्रोसेसिंग
धातु का उपयोग करके जीपीयू और सीपीयू के बीच कैमरा फ़ीड साझा करने का सबसे तेज़ तरीका क्या है?
दूसरे शब्दों में की तरह पाइप दिखेगा:
CMSampleBufferRef -> MTLTexture or MTLBuffer -> OpenCV Mat
मैं CMSampleBufferRef परिवर्तित कर रहा हूँ -> निम्नलिखित तरीके
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 मेरी धातु शेडर बाद मैं OpenCV को MTLTexture परिवर्तित finised है
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];
कुछ टिप्पणियों:
1) दुर्भाग्य से MTLTexture.getBytes
सीपीयू के लिए GPU से महंगा (नकल डेटा लगता है) और मेरे iphone 5 एस जो है बहुत ज्यादा ~ 100fps
2 में जब प्रसंस्करण पर 5ms चारों ओर ले जाता है) मैं कुछ लोगों को देखा है? निम्नलिखित विधि के साथ MTLTexture के बजाय MTLBuffer का उपयोग करें: metalDevice.newBufferWithLength(byteCount, options: .StorageModeShared)
(देखें: Memory write performance - GPU CPU Shared Memory)
हालांकि CMSampleBufferRef
और CVPixelBufferRef
साथ CoreVideo द्वारा प्रबंधित अनुमान है।
GPU सभी संकल्पों के लिए समर्थित नहीं है। मुझे पता है, यह तुम्हारा जवाब नहीं है। मैं सिर्फ जीपीयू के बारे में एक जानकारी देता हूं। –
क्या आपने GPUImage https://github.com/BradLarson/GPUImage –
को आजमाया है, मैंने GPUImage की कोशिश की लेकिन सबसे बड़ी बोटलेंक्ट GPU से CPU तक डेटा ट्रांसफर कर रही है। GPUImage ओपनजीएल का उपयोग अच्छा और धातु एपीआई के विपरीत के तहत साझा स्मृति नहीं हो सकता है। – pzo