У меня есть два набора точек, один из времени t-1 и текущего времени t.Первый набор был сгенерирован с использованием goodFeaturesToTrack
, а последний с использованием calcOpticalFlowPyrLK()
.Используя эти два набора точек, я затем оцениваю матрицу преобразования через estimateAffine2DPartial()
, чтобы отслеживать ее масштаб и вращение.Ниже приведен фрагмент кода:
// Precompute image pyramids
maxLvl = cv::buildOpticalFlowPyramid(_imgPrev, imPyr1, _winSize, maxLvl, true);
maxLvl = cv::buildOpticalFlowPyramid(tmpImg, imPyr2, _winSize, maxLvl, true);
// Optical flow call for tracking pixels
cv::calcOpticalFlowPyrLK(imPyr1, imPyr2, _currentPoints, nextPts, status, err, _winSize, maxLvl, _terminationCriteria, 0, 0.000001);
// Get transformation matrix between the two data sets
cv::Mat H = cv::estimateAffinePartial2D(_currentPoints, nextPts, inlier_mask, cv::RANSAC, 10.0, 2000, 0.99);
Используя H, я затем сопоставляю свои маскирующие точки, используя perspectiveTransform()
.Результат кажется точным для первых нескольких дюжин кадров, пока я не заметил некоторый дрейф (с точки зрения вращения), возникающий, когда отслеживаемый объект продолжает вращаться (обычно, когда вращение становится> M_PI).Я, честно говоря, озадачен тем, где виновник, но моё главное подозрение - возможно, размер моего окна для оптического потока может быть слишком маленьким или слишком большим.Однако изменение размера окна, похоже, не помогло, положение моего объекта все еще точно, но предполагаемое вращение (и масштаб) ухудшилось.Кто-нибудь может надеяться пролить свет на это?
С уважением и благодарностью.
РЕДАКТИРОВАТЬ: Изображения, прикрепленные к проблеме дрейфа
![Starting Frame](https://i.stack.imgur.com/oOFV5.png)
Стартовая рамка
![First few frames -- Rotation OK](https://i.stack.imgur.com/ZEsiy.png)
Первые несколько кадров - Вращение ОК
![Z-Rotation Drift occurs -- See Anchor Line](https://i.stack.imgur.com/skJDE.png)
Z-вращениеПроисходит дрейф - см. Линия привязки сместилась к красному прямоугольнику.