2012-03-14 14 views
14

का उपयोग कर ओपनसीवी ट्रैकिंग मैं अपने ट्रैकिंग एल्गोरिदम के आधार के रूप में कार्य करने के लिए इसका उपयोग करता हूं।ऑप्टिकल प्रवाह

//1. detect the features 
    cv::goodFeaturesToTrack(gray_prev, // the image 
    features, // the output detected features 
    max_count, // the maximum number of features 
    qlevel,  // quality level 
    minDist); // min distance between two features 

    // 2. track features 
    cv::calcOpticalFlowPyrLK(
    gray_prev, gray, // 2 consecutive images 
    points_prev, // input point positions in first im 
    points_cur, // output point positions in the 2nd 
    status, // tracking success 
    err);  // tracking error 

cv::calcOpticalFlowPyrLK इनपुट के रूप में पिछले छवि से अंकों की वेक्टर लेता है, और अगले छवि पर उपयुक्त अंक देता है। मान लीजिए कि पिछले छवि पर मेरे पास यादृच्छिक पिक्सेल (एक्स, वाई) है, तो मैं ओपनसीवी ऑप्टिकल फ्लो फ़ंक्शन का उपयोग करके अगली छवि पर इस पिक्सेल की स्थिति की गणना कैसे कर सकता हूं?

उत्तर

28

जैसा कि आप लिखते हैं, cv::goodFeaturesToTrack इनपुट के रूप में एक छवि लेता है और अंक के वेक्टर उत्पन्न करता है जिसे यह "ट्रैक करने के लिए अच्छा" लगता है। इन्हें अपने आसपास के इलाकों से बाहर निकलने की क्षमता के आधार पर चुना जाता है, और छवि में हैरिस कोनों पर आधारित होते हैं। एक ट्रैकर सामान्य रूप से पहली छवि को GoodFeaturesToTrack में पास करके और ट्रैक करने के लिए सुविधाओं का एक सेट प्राप्त करके प्रारंभ किया जाएगा। इन सुविधाओं को अनुक्रम में अगली छवि के साथ पिछले अंक के रूप में cv::calcOpticalFlowPyrLK पर पारित किया जा सकता है और यह अगले बिंदुओं को आउटपुट के रूप में प्रस्तुत करेगा, जो अगले पुनरावृत्ति में इनपुट बिंदु बन जाएगा।

यदि आप cv::goodFeaturesToTrack या इसी तरह के फ़ंक्शन द्वारा उत्पन्न सुविधाओं के बजाए पिक्सेल के एक अलग सेट को ट्रैक करने का प्रयास करना चाहते हैं), तो बस अगली छवि के साथ इन्हें cv::calcOpticalFlowPyrLK पर प्रदान करें।

बहुत बस, कोड में:

// Obtain first image and set up two feature vectors 
cv::Mat image_prev, image_next; 
std::vector<cv::Point> features_prev, features_next; 

image_next = getImage(); 

// Obtain initial set of features 
cv::goodFeaturesToTrack(image_next, // the image 
    features_next, // the output detected features 
    max_count, // the maximum number of features 
    qlevel,  // quality level 
    minDist  // min distance between two features 
); 

// Tracker is initialised and initial features are stored in features_next 
// Now iterate through rest of images 
for(;;) 
{ 
    image_prev = image_next.clone(); 
    feature_prev = features_next; 
    image_next = getImage(); // Get next image 

    // Find position of feature in new image 
    cv::calcOpticalFlowPyrLK(
     image_prev, image_next, // 2 consecutive images 
     points_prev, // input point positions in first im 
     points_next, // output point positions in the 2nd 
     status, // tracking success 
     err  // tracking error 
    ); 

    if (stopTracking()) break; 
} 
+1

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

+1

हां, आप केवल 'goodFeaturesToTrack' के साथ सुविधाओं का पता लगाते हैं, फिर ऑप्टिकल प्रवाह विधि बस उन्हें ट्रैक करती है। यदि आप प्रत्येक फ्रेम में सुविधाओं की एक निश्चित संख्या को बनाए रखना चाहते हैं, तो आपको यह पता लगाना होगा कि वर्तमान फ्रेम में कितनी विशेषताओं को सफलतापूर्वक ट्रैक किया गया था और फिर अगले फ्रेम को ट्रैक करने के लिए अतिरिक्त लोगों का पता लगाने का प्रयास किया गया। एक विकल्प प्रत्येक फ्रेम में सुविधाओं का पता लगाने के लिए होगा, और फिर वर्णनकर्ताओं की गणना करेगा और [इस पृष्ठ] पर कार्यों का उपयोग करके उन वर्णनकर्ताओं से मेल खाएं (http://opencv.itseez.com/modules/features2d/doc/features2d.html)। – Chris

+0

यदि आपको अधिक जानकारी चाहिए, तो एक नया प्रश्न पूछना बेहतर होगा। – Chris

1

सीवी :: calcOpticalFlowPyrLK (..) समारोह तर्क का उपयोग करता है:

सीवी :: calcOpticalFlowPyrLK (prev_gray, curr_gray, features_prev, features_next, स्थिति, अं);

cv::Mat prev_gray, curr_gray; 
std::vector<cv::Point2f> features_prev, features_next; 
std::vector<uchar> status; 
std::vector<float> err; 

सरल (आंशिक) अगले फ्रेम में पिक्सेल को खोजने के लिए कोड:

features_prev.push_back(cv::Point(4, 5)); 
cv::calcOpticalFlowPyrLK(prev_gray, curr_gray, features_prev, features_next, status, err); 

तो पिक्सेल सफलतापूर्वक मिला था status[0] == 1 और features_next[0] अगले फ्रेम में पिक्सेल के निर्देशांक दिखाएगा। मूल्य जानकारी इस उदाहरण में पाई जा सकती है: OpenCV/samples/cpp/lkdemo.cpp