OpenCV视频稳定

时间:2015-06-16 15:15:37

标签: c++ opencv matrix

我尝试使用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));

firstFramethisFrame是完全初始化的框架。问题是,estimate方法总是返回矩阵:

a busy cat

在此矩阵中,只有最后一个值(matrix[8])在帧与帧之间发生变化。我是否正确使用了videostab对象,如何在帧上应用此矩阵以获得结果?

1 个答案:

答案 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.0matrix[0], matrix[4] and matrix[8]1.0(使用作者& #39;使用此设置的代码提供了与作者图片显示相同的错误值。