我有這個問題,請參閱。OpenCV卡爾曼濾波器,從std ::向量擦除
我正在使用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
是空的。 如果我從我的項目中完全刪除卡爾曼濾波器,並且提及或使用它,錯誤消失。
從矢量中擦除後,您無法重新使用舊的迭代器。 – berak 2014-09-03 11:28:48