2010-08-07 18 views
32

के साथ वीडियो स्थिरीकरण मेरे पास एक वीडियो फीड है जो एक चलती कैमरे के साथ ली जाती है और इसमें चलती वस्तुओं को शामिल किया जाता है। मैं वीडियो को स्थिर करना चाहता हूं, ताकि सभी स्थिर वस्तुएं वीडियो फ़ीड में स्थिर रहेंगी। मैं इसे ओपनसीवी के साथ कैसे कर सकता हूं?ओपनसीवी

यानी उदाहरण के लिए, यदि मेरे पास दो छवियां हैं prev_frame और next_frame, मैं अगली_फ्रेम कैसे बदलूं ताकि वीडियो कैमरा स्थिर दिखाई दे?

उत्तर

32

मैं नीचे दिए समाधान का सुझाव कर सकते हैं:

  1. स्थानीय उच्च स्तर की सुविधाओं का उपयोग करना: OpenCV, सर्फ शामिल हैं, इसलिए: प्रत्येक फ्रेम के लिए, सर्फ सुविधाओं निकालें। फिर फीचर केडी-ट्री (ओपनसीवी में भी) का निर्माण करें, फिर संबंधित सुविधाओं के जोड़े को खोजने के लिए प्रत्येक दो लगातार फ्रेम से मेल खाते हैं। उन जोड़ों को उन फ्रेमों के बीच होमोग्राफी की गणना करने के लिए cvFindHomography में फ़ीड करें। स्थिर करने के लिए homographies (संयुक्त ..) के अनुसार वार फ्रेम। यह मेरे ज्ञान के लिए, एक बहुत ही मजबूत और परिष्कृत दृष्टिकोण है, हालांकि एसयूआरएफ निष्कर्षण और मिलान काफी धीमा हो सकता है
  2. यदि आप दो फ्रेम के बीच केवल मामूली आंदोलन की अपेक्षा करते हैं, तो आप उपरोक्त को "कम मजबूत" सुविधाओं के साथ करने का प्रयास कर सकते हैं, जैसे हैरिस कोने का पता लगाने और दोनों फ्रेमों में एक दूसरे के निकटतम कोनों के जोड़े का निर्माण, ऊपर के रूप में cvFindHomography को फ़ीड करें। शायद तेज़ लेकिन कम मजबूत।
  3. आप अनुवाद करने के लिए आंदोलन को प्रतिबंधित हैं, तो आप अधिक कुछ के साथ cvFindHomography को बदलने के लिए ... सरल, बस सुविधा जोड़े के बीच अनुवाद प्राप्त करने में सक्षम हो सकता है (उदाहरण के लिए औसत)
  4. उपयोग चरण सहसंबंध (रेफरी। http://en.wikipedia.org/wiki/Phase_correlation) , यदि आप केवल दो फ्रेम के बीच अनुवाद की उम्मीद करते हैं। ओपनसीवी में डीएफटी/एफएफटी और आईएफएफटी शामिल है, सूत्रों और स्पष्टीकरण पर जुड़े विकिपीडिया लेख देखें।

संपादित तीन टिप्पणियों मैं बेहतर स्पष्ट रूप से उल्लेख करना चाहिए, सिर्फ मामले में:

  1. homography आधारित दृष्टिकोण बहुत सटीक होने की संभावना है, इसलिए स्थिर वस्तु स्थिर रहेगा। हालांकि, homographies परिप्रेक्ष्य विरूपण और ज़ूम भी शामिल है, तो परिणाम थोड़ा सा दिख सकता है ... असामान्य (या कुछ तेजी से आंदोलनों के लिए भी विकृत)। हालांकि सटीक, यह कम दृष्टि से सुखदायक हो सकता है; तो आगे की प्रसंस्करण या, जैसे फोरेंसिक के लिए इसका उपयोग करें। लेकिन आपको इसे आज़माएं, कुछ दृश्यों/आंदोलनों के लिए भी सुपर-सुखदायक हो सकता है।
  2. मेरे ज्ञान के लिए, कम से कम कई मुफ्त वीडियो-स्थिरीकरण उपकरण चरण-सहसंबंध का उपयोग करते हैं।यदि आप कैमरे को "अन-शेक" करना चाहते हैं, तो यह बेहतर हो सकता है।
  3. इस क्षेत्र में काफी कुछ शोध चल रहा है। आपको कुछ कागजात में कुछ और अधिक परिष्कृत दृष्टिकोण मिलेंगे (हालांकि उन्हें केवल ओपनसीवी से अधिक की आवश्यकता होती है)।
+0

महान जवाब! एक अच्छी सूची मुझे चरण सहसंबंध के बारे में पता नहीं था। धन्यवाद ! –

3

यह एक मुश्किल समस्या है, लेकिन मैं अपने सिर के ऊपर से कुछ सरल स्थिति का सुझाव दे सकता हूं।

  1. शिफ्ट/स्थिर तत्वों को खोजने के लिए एक मनमाना राशि
  2. उपयोग पृष्ठभूमि घटाव threshold(abs(prev_frame-next_frame_rotated)) से बारी बारी से next_frame। आपको थ्रेसहोल्ड वैल्यू का उपयोग करने के लिए चारों ओर खेलना होगा।
  3. खोजें min(template_match(prev_frame_background, next_frame_rotated_background))
  4. रिकार्ड पारी/करीबी मिलान के रोटेशन और next_frame

यह समय के साथ एकाधिक फ्रेम के लिए अच्छी तरह से काम नहीं करेगा, ताकि आप एक का उपयोग कर में देखना चाहता हूँ पर लागू background accumulator इसलिए एल्गोरिदम की पृष्ठभूमि पृष्ठभूमि के साथ समान है।

2

मुझे zerm's answer को पूरा करने के लिए निम्नलिखित टिप्पणियां जोड़नी चाहिए। यदि आपकी एक स्थिर वस्तु का चयन किया जाता है तो यह आपकी समस्या को सरल बना देगा और फिर उस एकल वस्तु के साथ ज़र्म के दृष्टिकोण (1) के साथ काम करेगा। यदि आपको एक स्थिर वस्तु मिलती है और इसमें सुधार लागू होता है, तो मुझे लगता है कि यह सुनिश्चित करना सुरक्षित है कि अन्य स्थिर वस्तुएं भी स्थिर दिखाई देंगी।

हालांकि यह निश्चित रूप से आपके कठिन समस्या के लिए मान्य है, तो आप इस दृष्टिकोण के साथ निम्न समस्याओं होगा:

  • पहचान और homography आकलन कभी कभी विभिन्न कारणों के लिए असफल हो जायेगी: अवरोध, अचानक चलता है, मोशन ब्लर, गंभीर प्रकाश मतभेद। आपको इसे संभालने के तरीकों को खोजना होगा।

  • आपके लक्षित ऑब्जेक्ट में अवसर हो सकते हैं, जिसका अर्थ है कि इसका पता लगाना उस फ्रेम पर असफल हो जाएगा और आपको अवसरों को संभालना होगा जो स्वयं एक संपूर्ण शोध विषय है।

  • आपके हार्डवेयर और आपके समाधान की जटिलता के आधार पर, आपको SURF का उपयोग करके वास्तविक समय के परिणाम प्राप्त करने में कुछ परेशानी हो सकती है। आप ओपनबीवी के जीपीयू कार्यान्वयन या अन्य तेज फीचर डिटेक्टरों जैसे ओआरबी, बीआरईईएफ या फ्लेकर का प्रयास कर सकते हैं।

14

ओपनसीवी के कार्यों का अनुमान है RigidTransform() और warpAffine() जो इस तरह की समस्या को वास्तव में अच्छी तरह से संभालते हैं।

इसकी काफी इस के रूप में सरल:

Mat M = estimateRigidTransform(frame1,frame2,0) 
warpAffine(frame2,output,M,Size(640,480),INTER_NEAREST|WARP_INVERSE_MAP) 

अब outputframe2 की सामग्री है कि सबसे अच्छा frame1 को फिट करने के लिए गठबंधन किया जाता है। बड़ी बदलावों के लिए, एम शून्य मैट्रिक्स होगा या यह ओपनसीवी के संस्करण के आधार पर मैट्रिक्स नहीं हो सकता है, इसलिए आपको उन्हें फ़िल्टर करना होगा और उन्हें लागू नहीं करना होगा। मुझे यकीन नहीं है कि यह कितना बड़ा है; शायद आधा फ्रेम चौड़ाई, शायद अधिक।

अनुमानित करने के लिए तीसरा पैरामीटर RigidTransform एक बूलियन है जो यह बताता है कि क्या मनमाने ढंग से एफ़िन मैट्रिक्स को लागू करना है या इसे अनुवाद/रोटेशन/स्केलिंग तक सीमित करना है। कैमरे से छवि को स्थिर करने के प्रयोजनों के लिए आप शायद बाद वाले को चाहते हैं। वास्तव में, कैमरा छवि स्थिरीकरण के लिए आप केवल रोटेशन और अनुवाद के लिए इसे सामान्यीकृत करके लौटा मैट्रिक्स से किसी भी स्केलिंग को हटाना चाहते हैं।

इसके अलावा, एक चलती कैमरे के लिए, आप शायद समय के माध्यम से एम का नमूना देना चाहते हैं और एक माध्य की गणना करना चाहते हैं।

यहाँ estimateRigidTransform() बारे में अधिक जानकारी के लिए लिंक कर रहे हैं, और warpAffine()

+0

'आकार' विधि में कौन सी लाइब्रेरी है? – user3731622

2

यहाँ पहले से ही अच्छा जवाब है, लेकिन यह एक छोटा सा पुराने एल्गोरिथ्म का उपयोग करें और मैं विकसित इसी तरह की समस्या को हल करने के लिए प्रोग्राम ताकि मैं अतिरिक्त उत्तर जोड़ूं।

  1. सबसे पहले, आपको एसआईएफटी, एसयूआरएफ एल्गोरिदम जैसे फीचर एक्स्ट्रैक्टर का उपयोग करके छवि से फीचर निकालना चाहिए। मेरे मामले में, फास्ट + ओआरबी एल्गोरिदम सबसे अच्छा है। यदि आप अधिक जानकारी चाहते हैं, See this paper
  2. छवियों में सुविधाओं को प्राप्त करने के बाद, आपको छवियों के साथ मिलान करने वाली विशेषताओं को ढूंढना चाहिए। कई matcher हैं लेकिन ब्रूटफोर्स मैचर खराब नहीं है। यदि आपके सिस्टम में ब्रूटफोर्स धीमा है, तो आपको केडी-ट्री जैसे एल्गोरिदम का उपयोग करना चाहिए।
  3. अंतिम, आपको ज्यामितीय परिवर्तन मैट्रिक्स प्राप्त करना चाहिए जो रूपांतरित बिंदुओं की त्रुटि को कम करता है। आप इस प्रक्रिया में RANSAC एल्गोरिदम का उपयोग कर सकते हैं। आप ओपनसीवी का उपयोग करके इस प्रक्रिया को विकसित कर सकते हैं और मैंने इसे पहले से ही मोबाइल उपकरणों में विकसित किया है। See this repository
3

मैंने इस से अपना जवाब पिछले कर दिया।

  1. उपयोग cv2.goodFeaturesToTrack अच्छा कोनों को खोजने के लिए: How to stabilize Webcam video?


    कल मैं सिर्फ इस विषय पर कुछ काम करता है (Python में), मुख्य चरण हैं किया था।

  2. कोनों को ट्रैक करने के लिए cv2.calcOpticalFlowPyrLK का उपयोग करें।
  3. होमोग्राफी मैट्रिक्स की गणना करने के लिए cv2.findHomography का उपयोग करें।
  4. वीडियो फ्रेम को बदलने के लिए cv2.warpPerspective का उपयोग करें।

लेकिन परिणाम अब आदर्श नहीं है, मुझे goodFeatures के अलावा SIFT keypoints चुनना चाहिए।


स्रोत:

enter image description here

कार स्थिर करें:

enter image description here