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

Posted

技术标签:

【中文标题】如何使用适用于 Android 的 OpenCV 减少实时视频序列中的运动效果?【英文标题】:how can I reduce movement effects in a realtime sequence of video using OpenCV for Android? 【发布时间】:2014-07-30 14:53:45 【问题描述】:

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

感谢谁能帮助我!

【问题讨论】:

您好,感谢您的回答。该类仅适用于 C++ API,不在适用于 Android 的 OpenCV 中(最新版本为 2.4.9.0)。有什么算法可以应用于视频稳定吗?用Java实现它的一个例子会对我有所帮助。谢谢 【参考方案1】:

我不确定 Android 开发或 openCV java 实现,但我知道 OpenCV 有一个视频 Stabilization class,我使用它并取得了一些不错的效果。

您可以在此webpage 上找到结果演示

如果你可以让它在 Android 中工作,它应该完全符合你的要求。

您也可以使用 goodFeaturesToTrack 和光流来做到这一点:

如果你检测到一张图片上的特征,并以如下方式存储:

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;   
   

您可以将它组合成一个函数,但我有这段代码可以根据电影的第一张图像进行稳定。

【讨论】:

HiThat 类仅适用于 C++ API,它不在适用于 Android 的 OpenCV 中(最新版本为 2.4.9.0)。

以上是关于如何使用适用于 Android 的 OpenCV 减少实时视频序列中的运动效果?的主要内容,如果未能解决你的问题,请参考以下文章

类 DescriptorExtractor 在适用于 Android 的 opencv 4.1.0 中不可用

如何使用适用于 iOS 的 openCV 检测视频中的正方形?

如何在 Flutter 插件中添加 OpenCV

OpenCV VideoWriterfourCC Android

已安装的适用于 Windows 10 64 位的 OpenCV3.2.0 中缺少许多 .lib 文件

imShow 上的 OpenCV 崩溃仅适用于 USB 网络摄像头