Проблемы с CamShift на интерфейсе OpenCV C ++ - PullRequest
2 голосов
/ 19 октября 2010

Я немного новичок в OpenCV и по какой-то причине мне не удается заставить CamShift работать на C ++. Прежде всего, если у кого-нибудь есть рабочий пример CamShift, использующий интерфейс 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));

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

После этого происходит то, что внутри cv :: CamShift (), несмотря на то, что параметры имеют кажущиеся допустимыми значения, OpenCV генерирует cv :: 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

Похоже, что в базе данных отслеживания ошибок нет связанных ошибок, так что ... что я здесь упустил?

1 Ответ

2 голосов
/ 13 мая 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...