如何使用适用于 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 检测视频中的正方形?
OpenCV VideoWriterfourCC Android