background image

 

67  

 
Οι   τιμές   που   έχει   το   χρώμα   κόκκινο   στον   πιο   πάνω   πίνακα   είναι   πολύ  

συγκεκριμένες  και  δεν  μπορούμε  να  τις  χρησιμοποιήσουμε  ακριβώς  έτσι,  για  το  
λόγο   ότι   στο   αντικείμενο,   αν   και   φαινομενικά   υπάρχει   ομοιόμορφο   χρώμα,  

δημιουργούνται  διάφορες  διακυμάνσεις  στις  αποχρώσεις  που  οφείλονται  στον  
φωτισμό,   στις   σκιές   και   στην   οπτική   γωνία.   Στην   εφαρμογή   μας   για   να  
αποφύγουμε  διάφορα  προβλήματα  όπως  η  μη  ανίχνευση  αντικειμένου,  ορίσαμε  

σαν   χρώμα   κόκκινο   μια   εμβέλεια   χρωμάτων   για   να   υπάρχει   ευελιξία   στην  
ανίχνευση   αντικειμένου.      Οι   ελάχιστες   τιμές   χρώματος   R,   G,   B,   είναι   (κόκκινο  
200,  πράσινο  0,  μπλε  0)  και  οι  μέγιστες  είναι  (κόκκινο  255,  πράσινο  150,  μπλε  

150).  Όσα  εικονοστοιχεία  έχουν  χρωματική  ιδιότητα  σε  αυτή  την  ακτίνα  τιμών  
θεωρούνται  εικονοστοιχεία  του  αντικειμένου.  

     
Το   δεύτερο   πρόβλημα   αφορούσε   την   αναπαράσταση   των   χρωματικών  

χώρων   που   επιλέξαμε.   Οι   χρωματικοί   χώροι   που   χρησιμοποιήσαμε   για   την  

ανίχνευση  κινούμενου  αντικειμένου  ήταν  ο  κλασσικός  χώρος  RGB  και  οι  χώροι  
YUV  –  YCrCb.  

 

cvCvtColor(img,YUV,CV_RGB2YCrCb);  
 

Η   πιο   πάνω   συνάρτηση   που   χρησιμοποιήθηκε   μετατρέπει   ένα   χώρο   σε  

άλλο  δηλαδή  τον  RGB  στον  YCrCb.  Στη  συνέχεια  της  εφαρμογής  με  τη  χρήση  του  
IplImage   και   της   cvCreateImage   αποσυνθέτουμε   την   εικόνα   σε   διαφορετικά  

επίπεδα   όπως   θα   δούμε   και   πιο   κάτω   στα   αποτελέσματα   τα   οποία   παίρνουμε  
από  την  εφαρμογή.  

 
c  =  cvWaitKey(33);  
if(  c  ==  27  )  break;  

 
Η  ανίχνευση  αντικειμένων  και  οι  έλεγχοι  που  γίνονται  σε  αυτά  μπαίνουν  

σε   έναν   ατέρμονο   βρόγχο   ο   οποίος   σταματά   να   εκτελείται   μόνο   αν   ο   χρήστης  

πατήσει   το   πλήκτρο   ESC   (ASCII=   27)   ή   αν   περάσει   ένα   χρονικό   διάστημα  
αδράνειας  (33  δευτερόλεπτα).  Ο  σκοπός  αυτού  του  βρόγχου  είναι  να  γίνονται  οι  

έλεγχοι  σε  κάθε  καρέ  του  βίντεο.  

 
frame  =  cvQueryFrame(  capture  );  

Μέσα   στον   ατέρμονο   βρόγχο   ξεκινάμε   να   διαβάζουμε   τα   δεδομένα   που  

εισέρχονται  από  την  κάμερα.  Η  cvQueryFrame(  capture  )  παίρνει  ως  όρισμα  ένα  

δείκτη   σε   μια   δομή   της   CvCapture.   Στη   συνέχεια   παίρνει   το   επόμενο   καρέ   στη  
μνήμη  και  επιστρέφεται  ένας  δείκτης  στο  καρέ  εκείνο.  

Το   αντικείμενο   ορίζεται   ως   η   περιοχή   στην   οποία   τα   εικονοστοιχεία   της  

έχουν  χρώμα    μέσα  στην  κλίμακα  που  δώσαμε  πιο  πάνω.  Αν  ένα  εικονοστοιχείο  
και  τα  γειτονικά  του  έχουν  την  ιδιότητα  αυτή,  τότε  γίνεται  ομαδοποίησή  τους  
με   τεχνικές   κατάτμησης   με   βάση   την   περιοχή.   Για   λόγους   διεπαφής   με   το  

χρήστη  αλλά  και  για  να  μπορούν  να  γίνουν  στη  συνέχεια  οι  έλεγχοι  στις  ομάδες  
εικονοστοιχείων   που   εμφανίζονται,   προσθέσαμε   περιγράμματα   (contours)