2010-10-18 2 views
2

Я немного новичок в OpenCV, и по какой-то причине мне не удается заставить CamShift работать на C++. Прежде всего, если у кого-то есть рабочий пример CamShift с использованием интерфейса C++, я бы очень признателен ему.Проблемы с CamShift на интерфейсе OpenCV C++

Во-вторых, я пытаюсь адаптировать пример C к 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)); 

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

После этого происходит то, что внутри сорте :: CamShift(), несмотря на параметры, имеющие, казалось бы, действительные значения, OpenCV бросает резюме :: Exception и падает с следующее сообщение:

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 

Там, кажется, не будет какой-либо связанной с ошибкой в ​​базе данных отслеживания ошибок, так что ... то, что я пропускаю что-то здесь?

ответ

2

Это умеренно простая в обращении ошибка. Бывают ситуации, которые возникают (слишком быстро перемещаются, особенно натыкаются на камеру), которые вызывают логику cv :: RotatedRect (...), чтобы взорваться и создать коробку, которая либо сжимается до точки, либо больше, чем кадр. Затем эту ошибку поймают.

Выполняя именно это, я только что сделал копию кода и вручную проверил размер окна в оскорбительных местах. Но в конце дня я бы сказал, что эта функция предполагает, что ваша камера фиксирована, а освещение сцены не сильно меняется. Например, он не будет работать на машине, которая будет пытаться отслеживать другие автомобили.

Аварии, подобные этому, являются отличным примером того, почему «модульное тестирование» и «практика кода» ломаются в компьютерном зрении; его недостаточно, чтобы проверить, что он работает на тестовом сервере без отображения, но он также должен работать для всех диапазонов параметров, спектра данных и поведения пользователей ...

Смежные вопросы