2012-04-15 17 views
21

का उपयोग कर फ़ीचर ट्रैकिंग मुझे फोरम में similar question मिला। लेकिन वहां का जवाब मेरे प्रश्न का उत्तर नहीं देता है।ऑप्टिकल प्रवाह

  • अगर मैं केवल एक बार पहली छवि पर सुविधा का पता लगाने (goodFeaturesToTrack) करते हैं, और उसके बाद इन सुविधाओं को ट्रैक करने ऑप्टिकल प्रवाह (calcOpticalFlowPyrLK) का उपयोग करें, समस्या है: केवल पहली छवि पर पाया सुविधाओं कर सकते हैं ट्रैक किया जाना चाहिए। जब ये सुविधाएं छवि से परे जाती हैं, तो ट्रैक करने के लिए कोई सुविधा नहीं होगी।

  • यदि मैं प्रत्येक नई छवि के लिए सुविधा का पता लगाने की सुविधा देता हूं, तो सुविधा ट्रैकिंग स्थिर नहीं है, क्योंकि इस बार पता लगाई गई सुविधा इस बार नहीं मिली जा सकती है।

मैं 3 डी पुनर्निर्माण के लिए ऑप्टिकल प्रवाह का उपयोग कर रहा हूं। इसलिए मुझे कौन सी विशेषताओं को ट्रैक करने में दिलचस्पी नहीं है, इसके बजाय, मुझे केवल यह ख्याल है कि दृश्य के क्षेत्र में सुविधाओं को ट्रैक किया जा सकता है या नहीं। सारांशित करने के लिए, मेरा प्रश्न है: मैं पुरानी सुविधाओं को ट्रैक करने के लिए ऑप्टिकल प्रवाह का उपयोग कैसे कर सकता हूं, और इस बीच नई छवि सुविधाओं को देखने के क्षेत्र में आ सकता हूं और दृश्य सुविधाओं से परे पुरानी सुविधाओं को हटा सकता हूं?

+0

क्योंकि इस पुराने प्रश्न में इसका उल्लेख नहीं किया गया है, lkdemo का पायथन संस्करण इसके सी ++ समकक्ष से थोड़ा अधिक करता है, इसे जांचें, कुछ के लिए इसे हल कर सकता है: https://github.com/npinto/opencv/blob /master/samples/python/lkdemo.py –

उत्तर

17

कई दृष्टिकोण संभव हैं। एक बढ़िया तरीका यह इस प्रकार है:

  1. फ्रेम 1 में एन सुविधाओं का पता लगाने, इस फ्रेम कश्मीर में ऑप्टिकल प्रवाह
  2. द्वारा सुविधाओं को ट्रैक -फ़्रेम मीटर = 1
  3. फ्रेम कश्मीर में है अगर संख्या का सफलतापूर्वक ट्रैक सुविधाओं एन के तहत चला जाता है/2:
    • इस फ्रेम -फ़्रेम मीटर + 1
    • homography या मौलिक मैट्रिक्स के बीच गति का वर्णन गणना है मुख्य-फ़्रेम मीटर और मीटर + 1
    • एन सुविधाओं का पता लगाने और पुराने लोगों
    • कश्मीर त्यागें: इस विधि में = k + 1 जाने के लिए 2

मूल रूप से आप कैमरा गति का अनुमान पिछले दो कीफ्रेम के बीच।

जब से तुम क्या दृष्टिकोण 3D पुनर्निर्माण के लिए प्रयोग किया जाता है का उल्लेख नहीं था मैं या तो एच या एफ ग्रहण पहले अनुमान गति के लिए गणना की जाती है। उन्हें सटीक रूप से अनुमान लगाने के लिए कीफ्रेम के बीच आधार रेखा जितनी संभव हो उतनी चौड़ी होनी चाहिए। आम तौर पर, सबसे अच्छी रणनीति कैमरे के मोटे गति मॉडल को ध्यान में रखती है। यदि कैमरे को हाथ से रखा जाता है तो कैमरे को एक कार या रोबोट के शीर्ष पर तय होने पर एक अलग रणनीति का उपयोग किया जाना चाहिए। यदि मैं मदद करता हूं, तो मुझे पाइथन में एक न्यूनतम कामकाजी उदाहरण प्रदान कर सकता है, मुझे बताएं।

+0

धन्यवाद। यह एक अच्छा समाधान लगता है। मैं सी ++ के साथ काम करता हूं। तो उदार पेशकश के लिए किसी भी तरह से धन्यवाद। – Shiyu

+0

@fireant उत्तर के लिए धन्यवाद। अगर आप मुझे एक अजगर उदाहरण प्रदान कर सकते हैं तो मुझे खुशी होगी? – Clive

+0

@Clive, यह लगभग 2 साल देर हो चुकी है, लेकिन मुझे उम्मीद है कि यह किसी की मदद करेगा! [कोड] (http://pastebin.com/X1dpwT9q) जादू सुविधाओं को अद्यतन सुविधाओं पर टिप्पणी लाइन पोस्ट करने के बाद होता है। अधिकांश स्रोत कोड ओपनसीवी दस्तावेज के समान हैं जिन्हें पढ़ा जा सकता है [यहां] (http://docs.opencv.org/trunk/d7/d8b/tutorial_py_lucas_kanade.html)। –

3

बस दस्तावेज़ीकरण उद्देश्यों के लिए, ऑप्टिकल फ्लो ट्रैकिंग के कई अच्छे GPU/C++ कार्यान्वयन हैं। आपका कोड आपके उद्देश्यों के लिए बेहतर हो सकता है, लेकिन यदि आपको ट्रैक की आउटपुट डेटा की आवश्यकता है, तो निम्न में से किसी भी स्रोत को जांचने पर विचार करें: here, here, या here

0

मौजूदा सुविधाओं में नई सुविधाओं को जोड़ने का एक और अच्छा तरीका है। आप cv::goodFeaturesToTrack() में एक मुखौटा पास कर सकते हैं। तो आप एक नया मैट (मूल छवि, type: CV_8UC1 के समान आकार) बनाएंगे, सभी पिक्सल को 255 पर सेट करें और प्रत्येक फीचर पॉइंट को इस मैट में ब्लैक सर्कल के रूप में खींचे। जब आप इस मुखौटा को goodFeaturesToTrack() में पास करते हैं तो उन ब्लैक सर्कल को फ़ंक्शन द्वारा छोड़ा जाएगा।

मैं सुविधाओं की मात्रा सीमित करने की भी सिफारिश करता हूं। मान लीजिए कि आप इसे MAX_FEATURES = 300 तक सीमित कर दें। फिर आप प्रत्येक चक्र की जांच करें कि क्या आपके पास MAX_FEATURES - z (e.g. z = 30) से कम ट्रैक हैं। यदि आप करते हैं, तो ऊपर बताए गए जेड नई सुविधाओं की खोज करें और उन्हें अपने फीचर-कंटेनर में जोड़ें।

यह भी ध्यान रखें कि ट्रैकिंग विफल होने पर आपको सक्रिय रूप से सुविधाओं को हटाना होगा। इसलिए आपको calcOpticalFlowPyrLK की स्थिति आउटपुट देखना होगा।

+0

यह एक बहुत अच्छा तरीका है, हालांकि मैंने देखा है कि एक मुखौटा का उपयोग पूरी छवि का उपयोग करने से धीमा है। मैं विश्वास नहीं कर सकता लेकिन यह कम से कम संस्करण 3.2 में हो रहा है। – Pablo

संबंधित मुद्दे