我正在创建一个稳定视频流的程序。目前,我的程序基于相位相关算法运作。我在计算两个图像——基础图像和当前图像之间的偏移量。接下来,我根据新坐标对当前图像进行校正。虽然这个程序能够工作,但是结果并不令人满意。你可能会发现,经过处理的视频看起来不太好,整个视频似乎更加抖动。
原始视频
去抖视频
这是我目前的实现方式:
计算图像之间的偏移量:
原始视频
去抖视频
这是我目前的实现方式:
计算图像之间的偏移量:
Point2d calculate_offset_phase_optimized(Mat one, Mat& two) {
if(two.type() != CV_64F) {
cvtColor(two, two, CV_BGR2GRAY);
two.convertTo(two, CV_64F);
}
cvtColor(one, one, CV_BGR2GRAY);
one.convertTo(one, CV_64F);
return phaseCorrelate(one, two);
}
根据此坐标移动图像:
void move_image_roi_alt(Mat& img, Mat& trans, const Point2d& offset) {
trans = Mat::zeros(img.size(), img.type());
img(
Rect(
_0(static_cast<int>(offset.x)),
_0(static_cast<int>(offset.y)),
img.cols-abs(static_cast<int>(offset.x)),
img.rows-abs(static_cast<int>(offset.y))
)
).copyTo(trans(
Rect(
_0ia(static_cast<int>(offset.x)),
_0ia(static_cast<int>(offset.y)),
img.cols-abs(static_cast<int>(offset.x)),
img.rows-abs(static_cast<int>(offset.y))
)
));
}
int _0(const int x) {
return x < 0 ? 0 : x;
}
int _0ia(const int x) {
return x < 0 ? abs(x) : 0;
}
我在查看文档时发现了作者稳定器YouTube和基于角点检测的算法,它看起来很有吸引力,但是我不太清楚它是如何工作的。
所以我的问题是如何有效地解决这个问题。
其中一个条件是,该程序将在较慢的计算机上运行,因此重型算法可能不太合适。
谢谢!
附言:
对于文本中的任何错误,我深感抱歉-这是自动翻译。