2010-10-18 7 views
2

Je suis un peu nouveau pour OpenCV et pour une raison quelconque, je n'arrive pas à faire fonctionner CamShift en C++. Tout d'abord, si quelqu'un a un exemple de travail CamShift en utilisant l'interface C++, je l'apprécierais vraiment. Deuxièmement, j'essaie d'adapter l'exemple C à C++, juste pour le faire fonctionner. Rien d'extraordinaire, pour le moment. En fait, ce que je fais est la suivante:Problèmes avec CamShift sur l'interface OpenCV C++

// ----------------------- 

cv::Rect rect = /* some rectangle */; 
cv::Mat img = /* some image */; 

int bins = 16; 
int sMin = 10; 
int vMin = 10; 
int vMax = 250; 

cv::MatND hist(1, &bins, CV_8UC1); 

cv::Rect searchWindow = rect; 
cv::Mat roi = img(searchWindow); 
cv::Mat hsv; 
cv::cvtColor(roi, hsv, CV_RGB2HSV); 

cv::Mat mask; 
cv::inRange(hsv, cv::Scalar(0, sMin, vMin, 0), cv::Scalar(181, 256, vMax, 0), mask); 

const int channel = 0; 
float range[] = {0, 181}; 
const float* ranges[] = {range}; 
cv::calcHist(&hsv, 1, &channel, mask, hist, 1, &bins, ranges, true, false); 

double histMax; 
cv::minMaxLoc(hist, NULL, &histMax); 

hist *= histMax ? 255.0/histMax : 0.0; 

int channel = 0; 
float range[] = {0, 256}; 
const float* ranges[] = {range}; 
cv::Mat bp; 
cv::calcBackProject(&img, 1, &channel, hist, bp, ranges, 1, true); 

cv::RotatedRect foundObject = cv::CamShift(bp, searchWindow, 
    cv::TermCriteria(cv::TermCriteria::COUNT | cv::TermCriteria::EPS, 10, 1)); 

// ----------------------- 
// ----------------------- 
// ----------------------- 
// ----------------------- 

Après cela, ce qui se passe est que l'intérieur cv :: Camshift(), en dépit des paramètres ayant des valeurs apparemment valides, OpenCV jette un cv :: Exception et plantages le message suivant:

OpenCV Error: Assertion failed (box.size.width >= 0 && box.size.height >= 0 && t 
hickness <= 255) in unknown function, file ..\..\..\..\ocv\opencv\src\cxcore\cxd 
rawing.cpp, line 1666 

Il ne semble pas y avoir de bug lié à la base de données de suivi des bogues, alors ... qu'est-ce que je manque quelque chose, ici?

Répondre

2

Il s'agit d'un bogue modérément facile à reproduire. Il y a des situations qui se présentent (se déplaçant trop vite, en particulier heurtant la caméra) qui font exploser la logique de cv :: RotatedRect (...) et créent une boîte qui s'effondre à un point ou est plus grande que la frame. Cette erreur est ensuite interceptée. En faisant exactement cela, je viens de faire une copie du code et de vérifier manuellement la taille de la boîte dans les endroits fautifs. Mais à la fin de la journée, je dirais que cette fonction suppose que votre caméra est fixe et l'éclairage de la scène ne change pas beaucoup. Il ne fonctionnera pas monté sur une voiture en essayant de suivre d'autres voitures, par exemple. Les pannes de ce genre sont un bon exemple de la raison pour laquelle le «test unitaire» et les «pratiques de code» se dégradent dans la vision par ordinateur; ce n'est pas suffisant pour vérifier qu'il fonctionne sur le serveur de test sans affichage, mais il doit également fonctionner pour toutes les gammes de paramètres, le spectre de données et les comportements de l'utilisateur ...