【发布时间】:2014-09-22 21:47:42
【问题描述】:
我有这个问题,看看。
我正在使用 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) 行在指向我的KalmanFilterTracker 结构时为我提供了一个EXC_BAD_ACCESS,以及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 都不是空的。
如果我从我的项目中完全删除卡尔曼滤波器并提及或使用它,错误就会消失。
【问题讨论】:
-
从向量中擦除后不能重用旧的迭代器。
标签: c++ opencv exc-bad-access kalman-filter