मैं एक साधारण पाइपलाइन बना रहा हूं जो AVCaptureSession से छवियां प्राप्त करता है, उन्हें ओपनसीवी में संसाधित करता है, और फिर उन्हें ओपनजीएल में प्रस्तुत करता है। यह RosyWriter पर आधारित है लेकिन ऑडियो और रिकॉर्डिंग क्षमताओं के बिना। OpenCV प्रसंस्करण लगता है किCVImageBufferRef से स्मृति का स्वामित्व लें
- (void)processPixelBuffer: (CVImageBufferRef)pixelBuffer
{
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
int bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
int bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);
cv::Mat image = cv::Mat(bufferWidth,bufferHeight,CV_8UC4,pixel);
//do any processing
[self setDisplay_matrix:image];
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
}
इस समारोह में अब तक मैं किसी भी स्मृति कॉपी नहीं की है और मैं इसे इस तरह से रखने के लिए करना चाहते हैं। मुद्दा यह है कि pixelBuffer अभी भी display_image में निहित स्मृति का मालिक हो सकता है। प्रसंस्करण कोड नई मेमोरी आवंटित या नहीं कर सकता है और इसे छवि में संग्रहीत नहीं कर सकता है। यदि प्रसंस्करण ने नई मेमोरी आवंटित नहीं की है तो मुझे डेटा को मिटाने से रोकने के लिए display_matrix के साथ पिक्सेलबफर को पास करना होगा। क्या स्मृति के स्वामित्व को लेने का कोई तरीका है? मैं स्मृति को नष्ट किए बिना पिक्सेलबफर को भी नष्ट करना चाहता हूं।
संबंधित नोट पर, लॉकबेस एड्रेस वास्तव में क्या करता है? अगर मैं एक सीवी :: मैट के आसपास गुजर रहा था, तो CVImageBufferRef जोड़ी मुझे हर बार बेस पता को लॉक करना होगा जब मैं सीवी :: मैट के साथ डेटा को संशोधित/उपयोग करना चाहता हूं?
हाय हैमर, आप अपने सीवी :: मैट छवि को ओपनजीएल ईएस में कैसे प्रस्तुत करते हैं? अग्रिम धन्यवाद – lilouch