如何使用OpenCV for Android减少实时视频序列中的移动效果?

时间:2014-07-30 14:53:45

标签: android opencv

我是Android上OpenCV的新编程。我最近几天找了我的问题,但我不确定它的解决方案。 我正在制作一个软件,使用OpenCV for Android实时调整视频序列帧的大小(我正在使用java)。我观察到图像“跳舞”。对象很好,但它们在帧连续之间移动。这个动作我认为它是由我的脉冲引起的,因为当相机静止时它不会发生。 问题是“我该怎样做才能减少这种运动? 我读到了卡尔曼滤波器,但我不明白这个滤波器是如何工作的,以及我如何为我的情况实现它。这是减少运动效果的最佳方法吗?

感谢谁能帮助我!

1 个答案:

答案 0 :(得分:0)

我不确定Android开发或openCV java实现,但我知道OpenCV有一个Video Stabilization class,我已经使用了一些非常好的结果。

您可以在此webpage

上找到结果演示

如果您可以在Android中使用它,它应该完全符合您的要求。

您也可以使用goodFeaturesToTrack和Optical Flow:

如果您检测到一张图片上的功能并按以下方式存储它们:

std::vector<cv::Point2f> featuresOld;
cv::goodFeaturesToTrack(oldFrame, featuresOld, 100, 0.01, 0.1);

您可以使用以下功能“修复”下一帧:

Mat stabilizeImage(cv::Mat newFrame, cv::Mat oldFrame, std::vector<cv::Point2f> featuresOld) {
    cv::Mat greyNew, greyBack;
    cv::cvtColor(newFrame, greyNew, CV_BGR2GRAY);
    cv::cvtColor(oldFrame, greyOld, CV_BGR2GRAY);
    std::vector<cv::Point2f> currentFeatures;
    std::vector<float> err;
    std::vector<uchar> status;
    cv::calcOpticalFlowPyrLK(greyOld, greyNew, featuresOld, currentFeatures, status, err);
    cv::Mat correctionMatrix = estimateRigidTransform(currentFeatures, backgroundFeatures, 0);
    cv::Mat corrected;
    cv::warpAffine(newFrame, corrected, correctionMatrix, newFrame.size());
    return corrected;   
}   

你可以将它合并为一个功能,但是我根据电影的第一张图片让这个代码稳定下来。