2012-09-08 10 views
8

मैं ओपनसीवी का उपयोग करके सरल ब्लॉब ट्रैकिंग बनाने की कोशिश कर रहा हूं। मैंने findcontours का उपयोग कर blobs का पता चला है। मैं उन ब्लॉब्स को निरंतर आईडी देना चाहता हूं।ब्लॉब ट्रैकिंग एल्गोरिदम

मैंने पिछले फ्रेम और वर्तमान फ्रेम में ब्लॉब्स की एक सूची एकत्र की है। फिर मैंने पिछले फ्रेम और वर्तमान फ्रेम में प्रत्येक ब्लॉब के बीच की दूरी ली। मैं जानना चाहता हूं कि ब्लॉब्स को ट्रैक करने और उन्हें एक आईडी देने के लिए और क्या चाहिए। मैंने पिछले और वर्तमान फ्रेम ब्लॉब्स के बीच की दूरी ली है, लेकिन ब्लॉब्स के बीच मापा दूरी का उपयोग करके मैं ब्लॉब्स को एक सतत आईडी कैसे निर्दिष्ट कर सकता हूं?

+0

क्या आप अपना प्रश्न कृपया बता सकते हैं? – bokan

+1

प्रश्न –

उत्तर

6

पहले फ्रेम में, आप किसी भी तरह से आईडी को असाइन कर सकते हैं, पहले आपको ढूंढने के लिए 1, दूसरे के लिए 2 ... या बस उन्हें संग्रह में उनकी स्थिति के अनुसार आईडी दें।

फिर अगले फ्रेम पर आपको सर्वोत्तम मिलान का उपयोग करना होगा। ब्लब्स ढूंढें, वर्तमान ब्लब्स और पिछली छवि के सभी ब्लॉब्स के बीच सभी दूरी की गणना करें और प्रत्येक पिछली आईडी को निकटतम ब्लॉब पर असाइन करें। केवल उस क्षेत्र में प्रवेश करने वाले ब्लॉब्स को नई आईडी मिल जाएगी।

अब आपके पास दो फ्रेम हैं, आप अगले के लिए आंदोलन भविष्यवाणी कर सकते हैं। ब्लॉब की पिछली और वर्तमान स्थिति के बीच बस डेल्टाएक्स और डेल्टाई की गणना करें। आप भविष्य की स्थिति का अनुमान लगाने के लिए इस जानकारी का उपयोग कर सकते हैं। इस भविष्य की स्थिति के खिलाफ मैच।

यदि आपको कई ओवरलैपिंग ब्लब्स नहीं हैं, तो यह काम करना चाहिए, और यदि आंदोलन प्रत्येक फ्रेम के बीच बहुत तेज और अनियमित नहीं है।

स्कोरिंग सिस्टम का उपयोग करके अधिक सटीक होना संभव है कई छवियां:
पहले 3 या 5 छवियों के लिए पद प्राप्त करें। फ्रेम के किसी भी ब्लॉब के लिए, फ्रेम 2 पर सबसे नज़दीक की तलाश करें, गति (डेल्टाएक्स डेल्टाई) की गणना करें, फ्रेम 3, 4, 5 के लिए अनुमानित स्थिति के निकटतम खोजें ... भविष्यवाणी पॉजिटन और निकटतम ब्लॉब के बीच सभी दूरी को समेटें स्कोर बनें फ्रेम 2 पर दूसरे निकटतम का उपयोग करके ऐसा ही करें (यह दूसरी दिशा में खोजेगा)। स्कोर जितना कम होगा उतना ही अच्छा ब्लॉब होगा।

यदि आपके पास बहुत सारे ब्लब्स हैं, तो आपको गति प्रक्रिया के लिए क्वाड्री का उपयोग करना चाहिए। वर्ग की दूरी की तुलना करें; यह बहुत से sqrt computations से बच जाएगा।

यह जानना महत्वपूर्ण है कि आपका ब्लॉब आपके अलौकिकता को ट्यून करने के लिए कैसे कदम उठाता है।

+0

प्रश्न संशोधित, क्या आप कृपया मुझे उदाहरण और गणना या चित्रों से अधिक स्पष्टीकरण दें? मुझे उस प्रक्रिया को समझने में बहुत खुशी होगी। या आप मुझे उस –

+0

@MoazELdeen के लिए एक संदर्भ दिखा सकते हैं मैंने जवाब संपादित किया – bokan

3

यहाँ ब्लॉब ट्रैकिंग के एक OpenCV कोड नमूना है:

#include "stdafx.h" 

#include <opencv2\opencv.hpp> 

IplImage* GetThresholdedImage(IplImage* img) 
{ 
    // Convert the image into an HSV image 
    IplImage* imgHSV = cvCreateImage(cvGetSize(img), 8, 3); 
    cvCvtColor(img, imgHSV, CV_BGR2HSV); 

    IplImage* imgThreshed = cvCreateImage(cvGetSize(img), 8, 1); 

    // Values 20,100,100 to 30,255,255 working perfect for yellow at around 6pm 
    cvInRangeS(imgHSV, cvScalar(112, 100, 100), cvScalar(124, 255, 255), imgThreshed); 

    cvReleaseImage(&imgHSV); 

    return imgThreshed; 
} 

int main() 
{ 
    // Initialize capturing live feed from the camera 
    CvCapture* capture = 0; 
    capture = cvCaptureFromCAM(0); 

    // Couldn't get a device? Throw an error and quit 
    if(!capture) 
    { 
     printf("Could not initialize capturing...\n"); 
     return -1; 
    } 

    // The two windows we'll be using 
    cvNamedWindow("video"); 
    cvNamedWindow("thresh"); 

    // This image holds the "scribble" data... 
    // the tracked positions of the ball 
    IplImage* imgScribble = NULL; 

    // An infinite loop 
    while(true) 
    { 
     // Will hold a frame captured from the camera 
     IplImage* frame = 0; 
     frame = cvQueryFrame(capture); 

     // If we couldn't grab a frame... quit 
     if(!frame) 
      break; 

     // If this is the first frame, we need to initialize it 
     if(imgScribble == NULL) 
     { 
      imgScribble = cvCreateImage(cvGetSize(frame), 8, 3); 
     } 

     // Holds the yellow thresholded image (yellow = white, rest = black) 
     IplImage* imgYellowThresh = GetThresholdedImage(frame); 

     // Calculate the moments to estimate the position of the ball 
     CvMoments *moments = (CvMoments*)malloc(sizeof(CvMoments)); 
     cvMoments(imgYellowThresh, moments, 1); 

     // The actual moment values 
     double moment10 = cvGetSpatialMoment(moments, 1, 0); 
     double moment01 = cvGetSpatialMoment(moments, 0, 1); 
     double area = cvGetCentralMoment(moments, 0, 0); 

     // Holding the last and current ball positions 
     static int posX = 0; 
     static int posY = 0; 

     int lastX = posX; 
     int lastY = posY; 

     posX = moment10/area; 
     posY = moment01/area; 

     // Print it out for debugging purposes 
     printf("position (%d,%d)\n", posX, posY); 

     // We want to draw a line only if its a valid position 
     if(lastX>0 && lastY>0 && posX>0 && posY>0) 
     { 
      // Draw a yellow line from the previous point to the current point 
      cvLine(imgScribble, cvPoint(posX, posY), cvPoint(lastX, lastY), cvScalar(0,255,255), 5); 
     } 

     // Add the scribbling image and the frame... and we get a combination of the two 
     cvAdd(frame, imgScribble, frame); 
     cvShowImage("thresh", imgYellowThresh); 
     cvShowImage("video", frame); 

     // Wait for a keypress 
     int c = cvWaitKey(10); 
     if(c!=-1) 
     { 
      // If pressed, break out of the loop 
      break; 
     } 

     // Release the thresholded image... we need no memory leaks.. please 
     cvReleaseImage(&imgYellowThresh); 

     delete moments; 
    } 

    // We're done using the camera. Other applications can now use it 
    cvReleaseCapture(&capture); 
    return 0; 
} 
1

यू ब्लॉब पता लगाने के लिए cvblobslib लाइब्रेरी का उपयोग कर सकते हैं ...

  1. अगर आपके अंतर-फ्रेम ब्लॉब आंदोलन अंतर ब्लॉब से भी कम है दूरी .. यह ब्लॉब विस्थापन अंतर ब्लॉब दूरी से कम है, तो आप एक सूची बना सकते हैं और पिछले फ्रेम में ब्लॉब्स के पड़ोस में पड़ने वाले प्रत्येक मौजूदा फ्रेम में ब्लॉब जोड़ना जारी रख सकते हैं ...
  2. यदि यो यूआर ब्लब्स में कुछ स्थिर विशेषताएं हैं जैसे अंडाकार ... पहलू अनुपात (इसमें बाउंडिंग बॉक्स लगाने के बाद) आप इन सुविधाओं के साथ ब्लॉब्स को एक सूची में समूहित कर सकते हैं ..
संबंधित मुद्दे