是否有一个像样的图像稳定库(光流周围的东西)那里可以给我一个三维变换矩阵来稳定?
我只想稳定10帧序列.具有Objective-C包装器的库将是最好的,但更深层次的东西(C,C++)是可以的.
提前致谢.
我正在尝试使用Dense Optical Flow执行复杂的图像扭曲(我试图将第二个图像切换成与第一个图像大致相同的形状).我可能会把这一切都搞错了但是我发布了我尝试过的内容:
cv::Mat flow;
cv::calcOpticalFlowFarneback( mGrayFrame1, mGrayFrame2, flow, 0.5, 3, 15, 3, 5, 1.2, 0 );
cv::Mat newFrame = cv::Mat::zeros( frame.rows, frame.cols, frame.type() );
cv:remap( frame, newFrame, flow, cv::Mat(), CV_INTER_LINEAR );
Run Code Online (Sandbox Code Playgroud)
如果我正在计算2个灰度帧的流量垫的想法.我找回了一个似乎有意义的流垫,但现在我正在尝试使用此流信息重新映射我的原始(即非灰度)图像.
我认为重映射功能是我想要的,但是我得到了一个非常严重失真的图像.我的所有颜色信息都没有存在.我最终得到的橙色和黑色图像与我的原始图像有很小的相似之处.
我猜我错误地理解了重映射功能,它要么不做我想做的事情,要么就是因为我传入的内容出了问题.
如果前者有人对我如何解决这个问题有任何建议?如果是后者,我错了什么?
任何帮助非常感谢!
我正在创建一个程序来稳定视频流.目前,我的程序基于相位相关算法工作.我正在计算两个图像之间的偏移 - 基础和当前.接下来,我根据新坐标校正当前图像.这个程序有效,但效果不理想.相关链接您可能会发现处理后的视频显得不受欢迎,并且整个视频的抖动变得更糟.
Orininal video
Unshaked video
我目前的认识是:
计算图像之间的偏移量:
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);
}
Run Code Online (Sandbox Code Playgroud)
根据此坐标移动图像:
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 …Run Code Online (Sandbox Code Playgroud) 我有两个连续的图像,我想在 C# 中使用 EmguCv 来稳定它们。
我找到了很多关于如何执行图像稳定的信息,但是我找不到任何关于如何使用 Emgu 稳定两个连续帧的详细说明(实际代码示例)。
我明白我必须执行以下操作:
所以基于以上我尝试进行图像稳定。
我有两个连续的帧:
Image<Gray, ushort> FirstImage = new Image<Gray, ushort>(Width, Height);
Image<Gray, ushort> SecondImage= new Image<Gray, ushort>(Width, Height);
Run Code Online (Sandbox Code Playgroud)
我尝试计算好的特征:
Emgu.CV.Features2D.GFTTDetector _GFTTdetector = new Emgu.CV.Features2D.GFTTDetector(500,0.05);
var GFP1 = _GFTTdetector.Detect(FirstImage);
Run Code Online (Sandbox Code Playgroud)
但是,当我调用 .Detect 时,我收到 OpenCV 异常,并且无法继续:
$Exception {"OpenCV: scn == 3 || scn == 4"} Emgu.CV.Util.CvException
有谁知道为什么我会得到这个例外?
此外,如果有人可以发布如何使用以下函数的示例代码,我将不胜感激,因为我不确定我将使用哪些输入参数:
CvInvoke.CalcOpticalFlowPyrLK()CvInvoke.cvFindHomography()CvInvoke.cvWarpPerspective()最后 _GFTTdetector.Detect()返回一个KeyPoint[]类型,但是CvInvoke.CalcOpticalFlowPyrLK()只接受 …
我在 OpenCV (cv::videostab) 中搜索了一个函数,它允许我实时进行视频稳定。但据我了解,OpenCV 尚不可用。因此 TwoPassStabilizer(OnePassStabilizer) 需要一次完整的视频,而不是两个连续的帧。
Ptr<VideoFileSource> source = makePtr<VideoFileSource>(inputPath); //it's whole video
TwoPassStabilizer *twopassStabilizer = new TwoPassStabilizer();
twoPassStabilizer->setFrameSource(source);
Run Code Online (Sandbox Code Playgroud)
所以我必须在没有 OpenCV 视频稳定类的情况下做到这一点。这是真实的?
根据我在网上看到的,最有效的图像稳定算法之一是使用格雷编码的位平面匹配.但是,我无法理解它(格雷码本身并不复杂,而是其余部分).任何人都可以向我指出一个关于这个主题的资源(或另一种稳定的稳定方法),它略低于大多数发表论文的水平吗?示例代码胜过抽象广义方程.
就我的目的而言,视频中没有平移或缩放,帧中没有移动物体.
考虑我有一个稳定的视频帧,其中稳定只通过旋转和平移(没有缩放):
如图所示,图像的右侧是先前像素的对称,即旋转后的黑色区域被对称填充.我添加了一条红线,表明它更清楚.

我想找到我稍后会使用的旋转角度.我可以通过SURF或SIFT功能完成此操作,但是,在实际情况下,我不会有原始帧.
我可能会通过蛮力找到角度,但我想知道是否有更好更优雅的解决方案.注意,对称部分的强度值与原始部分的精度值不完全相同.我已经检查了一些值,例如,V字的键盘上的右上像素是 [51 49 47]在原始部件而是[50 50 47]在对称拷贝,这意味着相应的像素不被保证是相同的RGB值.
我将在Matlab或python上实现它,并使用完成视频稳定ffmpeg.
编辑:我只有稳定的视频,无法访问原始视频或由ffmpeg生成的文件.
任何帮助/建议表示赞赏,
我试图在OpenCV中发布视频处理.由于我的相机没有固定(必须是移动的),由于振动和平移,产生的视频非常抖动.因此,我尝试查看的每个帧都有模糊,如果它甚至可以检测到一些模糊的图像,那么这将使我的检测不太准确.
我在网上搜索过,似乎有很多关于使用陀螺仪补偿相机运动的讨论.
有没有相机会帮助解决这个问题?我一直在使用GoPro.
有没有可以帮助处理视频的算法?
我没有图像稳定的背景,也不知道从哪里开始.将不胜感激任何建议.