2012-06-19 3 views
5

का उपयोग कर ऑप्टिकल प्रवाह ऑप्टिकल प्रवाह का अनुमान लगाने के लिए मैं ओपनसीवी के पिरामिड लुकास कानेड फ़ंक्शन का उपयोग कर रहा हूं। मैं cvGoodFeaturesToTrack और फिर cvCalcOpticalFlowPyrLK पर कॉल करता हूं।ओपनसीवी

while(1) 
{ 
... 

cvGoodFeaturesToTrack(frameAth,eig_image,tmp_image,cornersA,&corner_count,0.01,5,NULL,3,0.4); 

std::cout<<"CORNER COUNT AFTER GOOD FEATURES2TRACK CALL = "<<corner_count<<std::endl; 

cvCalcOpticalFlowPyrLK(frameAth,frameBth,pyrA,pyrB,cornersA,cornersB,corner_count,cvSize(win_size,win_size),5,features_found,features_errors,cvTermCriteria(CV_TERMCRIT_ITER| CV_TERMCRIT_EPS,20,0.3),CV_LKFLOW_PYR_A_READY|CV_LKFLOW_PYR_B_READY); 

cvCopy(frameBth,frameAth,0); 
... 
} 

frameAth पिछले ग्रे फ्रेम और frameBth एक वेब कैमरा से वर्तमान ग्रे फ्रेम है: यह मेरा कोड है। लेकिन जब मैं प्रत्येक फ्रेम में ट्रैक करने के लिए अच्छी सुविधाओं की संख्या आउटपुट करता हूं तो राशि समयावधि के बाद घट जाती है और घटती रहती है। लेकिन अगर मैं प्रोग्राम को समाप्त करता हूं और कोड को फिर से निष्पादित करता हूं (वेबकैम के दृश्य को परेशान किए बिना) बहुत अधिक संख्याओं को ट्रैक करने के लिए अच्छी सुविधाओं के रूप में दिखाया जाता है ... दृश्य के समान क्षेत्र के लिए और उसी के लिए कैसे दृश्य समारोह बिंदुओं की संख्या में इस तरह का अंतर देता है ... और अंतर उच्च है ..eg.. अंक की संख्या 4 मिनट के निष्पादन के बाद ट्रैक करने के लिए अच्छी सुविधाओं के रूप में 20 या 50 है ... लेकिन जब एक ही कार्यक्रम समाप्त हो गया और फिर से निष्पादित किया गया यह संख्या 500 से 700 प्रारंभिक है लेकिन फिर धीरे-धीरे घटती है..मैं पिछले 4 महीनों के लिए ओपनसीवी का उपयोग कर रहा हूं, इसलिए मैं ओपनसीवी के लिए नया हूं .. मुझे गाइड करें या मुझे बताएं कि मुझे समाधान कहाँ मिल सकता है ... बहुत सारे अग्रिम में thanx ..

उत्तर

1

आप cvGoodFeatureToTrack पर कॉल कर रहे हैं और संदर्भ द्वारा corner_count पास कर रहे हैं। यदि कम सुविधाएं मिलती हैं तो इसका मूल्य कम हो जाता है। लूप के प्रत्येक पुनरावृत्ति में cvGoodFeaturesToTrack पर कॉल करने से पहले आपको corner_count के प्रारंभिक मूल्य पर रीसेट करना होगा।

+0

@ sgar91 ... thanx ... मुझे आपके सुझाव –

+0

द्वारा प्रदर्शन में सुधार हुआ था, मैंने थोड़ी देर पहले एक ही समस्या का अनुभव किया था। – sgarizvi

+0

@rotating_image मुझे समझ में नहीं आता कि यह उत्तर स्वीकृत के रूप में क्यों चेक किया गया। जब आप सुविधाओं की संख्या को रीसेट करते हैं तो इससे 'cvCalcOpticalFlowPyrLK' को कॉल करने का कोई मतलब नहीं होता है। यह आपको वही परिणाम देगा जब आप इसे कॉल नहीं करेंगे ... पहले दस्तावेज़ पढ़ें। – ArtemStorozhuk

6

आप (पाश से पहले शुरुआत में,) एक बार cvGoodFeaturesToTrack कॉल करने के लिए ट्रैक करने के लिए अच्छा सुविधाओं पता लगाने के लिए और से cvCalcOpticalFlowPyrLK का उपयोग कर इन सुविधाओं को ट्रैक कर सकते है। डिफ़ॉल्ट opencv उदाहरण पर एक नज़र डालें: OpenCV/samples/cpp/lkdemo.cpp

+0

@ एस्टोर ... त्वरित प्रतिक्रिया के लिए थेंक्स एस्टोर ... जो प्रक्रिया आपने कहा वह दृश्य के क्षेत्र में एक चलती वस्तु को ट्रैक करने के लिए ठीक काम करता है ... हालांकि मैं कैमरा गति का अनुमान लगाने के लिए ऑप्टिकल प्रवाह का उपयोग कर रहा हूं .. इसलिए जब एक कैमरा अपने क्षेत्र के दृश्य को बदल रहा है बदल रहा है ... दृश्य विवरण भी धीरे-धीरे बदल रहे हैं ... इसलिए यदि मैं एक बार अच्छाफेचरस्ट्रैक कॉल करता हूं तो जब दृश्य धीरे-धीरे बदल रहा है तो मुझे नए अंक नहीं मिल रहे हैं प्रारंभिक बिंदु मौजूद नहीं हो सकते हैं नए फ्रेम में ... –

+0

@ user1466741 कैमरा गति का पता लगाने के लिए आप [फ्रेम घटाव] (http://www.youtube.com/watch?v=KREoXEy9ojY) का उपयोग करके गति का पता लगाने का उपयोग कर सकते हैं। यह एल्गोरिदम बहुत आसान है - आपको दो लगातार फ्रेम को कम करना होगा, थ्रेसहोल्ड करना होगा और जांच करें कि गति का क्षेत्र (वीडियो पर सफेद पिक्सल) बड़ा है (पूर्ण क्षेत्र या कुछ का 80%) तो कैमरा चल रहा है। हालांकि यह एल्गोरिदम खराब है जब illumanion बदल रहा है (रोशनी चालू/बंद करें) या जब कोई (या कुछ) कैमरे के बहुत करीब जा रहा है। – ArtemStorozhuk

+0

@Astor ... विचार के लिए thanx लेकिन ऑप्टिकल प्रवाह के साथ मैं आसानी से आंदोलन की दिशा और परिमाण प्राप्त कर सकता हूं ... goodfeaturestotrack समारोह आवधिकता (फ्रेम की कुछ संख्या के बाद या जब goodpoints2track नीचे जाना) हल समस्या? मेरा मतलब है कि अगर मैं ट्रैक करने के लिए अंक को ताज़ा करता हूं ... –