У меня такая проблема, см.
Я использую OpenCV для отслеживания руки в видео. Рука обнаруживается с помощью CascadeDetector, а затем отслеживается с помощью CamSHIFT. Я также использую фильтр Калмана, чтобы исправить положение руки, если алгоритм CamShift дает сбой на некоторых кадрах.
Проблема возникает, когда я пытаюсь стереть элемент из std::vector, где я храню свои руки. Причина стирания заключается в том, что из-за некоторых проблем лицо неправильно интерпретируется как рука, поэтому я обнаруживаю лица, и если область руки пересекается с областью лица, я удаляю эту руку. Я знаю, очень наивен, но я сейчас в самом начале пути. Код выглядит следующим образом:
class Hand {
...
public:
struct
{
...
struct {
cv::Mat_<float> measurement;
cv::KalmanFilter KF;
cv::Mat state;
cv::Mat processNoise;
} KalmanTracker;
} Tracker;
};
...
std::vector<Hand> hands;
...
std::vector<cv::Rect> faces;
faceCascade.detectMultiScale(frame, faces, 1.1, 2, CV_HAAR_FIND_BIGGEST_OBJECT);
// iterate through hands
for (std::vector<Hand>::iterator it = hands.begin(); it != hands.end(); ++it) {
// iterate through faces:
for (std::vector<cv::Rect>::iterator fc = faces.begin(); fc != faces.end(); ++fc) {
cv::Rect intersection = (*it).handBox.boundingRect() & (*fc);
// check if they have at leasy 75% intersection
if (intersection.area() >= ((*it).handBox.boundingRect().area() * 0.75)) {
// delete that hand from list
hands.erase(it); // this gets me a a EXC_BAD_ACCESS
}
}
}
Строка hands.erase(it)
дает мне EXC_BAD_ACCESS
, указывая на мою структуру KalmanFilterTracker
, а также эта строка в mat.hpp
с EXC_i386_GPFLT
:
inline void Mat::release()
{
if( refcount && CV_XADD(refcount, -1) == 1 ) // EXC_BAD_ACCESS, code=EXC_i386_GPFLT
...
}
Ни hands
, ни faces
не пусты. Если я полностью удалю фильтр Калмана из своего проекта и любое упоминание о нем или его использование, ошибка исчезнет.