我尝试使用OpenCV videostab模块实现视频稳定功能。我需要在流中进行,所以我试图在两帧之间进行运动。学习文档后,我决定这样做:
estimator = new cv::videostab::MotionEstimatorRansacL2(cv::videostab::MM_TRANSLATION);
keypointEstimator = new cv::videostab::KeypointBasedMotionEstimator(estimator);
bool res;
auto motion = keypointEstimator->estimate(this->firstFrame, thisFrame, &res);
std::vector<float> matrix(motion.data, motion.data + (motion.rows*motion.cols));
firstFrame
和thisFrame
是完全初始化的框架。问题是,estimate
方法总是返回矩阵:
在此矩阵中,只有最后一个值(matrix[8]
)在帧与帧之间发生变化。我是否正确使用了videostab对象,如何在帧上应用此矩阵以获得结果?
答案 0 :(得分:0)
我是OpenCV的新手,但这是我解决这个问题的方法。 问题在于:
std::vector<float> matrix(motion.data, motion.data + (motion.rows*motion.cols));
对我来说,motion
矩阵的类型为64-bit double
(请查看here}并将其复制到std::vector<float> matrix
类型32-bit float
混乱中价值。
要解决此问题,请尝试使用以下代码替换上面的行:
std::vector<float> matrix;
for (auto row = 0; row < motion.rows; row++) {
for (auto col = 0; col < motion.cols; col++) {
matrix.push_back(motion.at<float>(row, col));
}
}
我已经在重复的点集上运行estimator
对其进行了测试,并且它给出了预期结果,其中大多数条目接近0.0
且matrix[0], matrix[4] and matrix[8]
为1.0
(使用作者& #39;使用此设置的代码提供了与作者图片显示相同的错误值。