我是Android上OpenCV的新编程。我最近几天找了我的问题,但我不确定它的解决方案。 我正在制作一个软件,使用OpenCV for Android实时调整视频序列帧的大小(我正在使用java)。我观察到图像“跳舞”。对象很好,但它们在帧连续之间移动。这个动作我认为它是由我的脉冲引起的,因为当相机静止时它不会发生。 问题是“我该怎样做才能减少这种运动? 我读到了卡尔曼滤波器,但我不明白这个滤波器是如何工作的,以及我如何为我的情况实现它。这是减少运动效果的最佳方法吗?
感谢谁能帮助我!
答案 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;
}
你可以将它合并为一个功能,但是我根据电影的第一张图片让这个代码稳定下来。