4

我有两个连续的图像,我想在 c# 中使用 EmguCv 来稳定它们。

我找到了很多关于如何执行图像稳定的信息,但是我找不到任何关于如何使用 Emgu 稳定两个连续帧的详细说明(实际代码示例)。

一般来说,我知道我必须执行以下操作:

  1. 使用 GFTTDetector() 计算第一帧的好特征,得到第一幅图像的好特征点(GFP1)。
  2. 然后我需要使用 CvInvoke.CalcOpticalFlowPyrLK() 计算光流,以获得第二张图像 (GFP2) 的良好特征点。
  3. 使用 GFP1 和 GFP2,我可以使用 CvInvoke.cvFindHomography() 函数计算单应矩阵。
  4. 最后我必须使用 CvInvoke.cvWarpPerspective() 来稳定框架。

所以基于上述我尝试执行图像稳定。

我有两个连续的帧:

Image<Gray, ushort> FirstImage = new Image<Gray, ushort>(Width, Height);
Image<Gray, ushort> SecondImage= new Image<Gray, ushort>(Width, Height);

我试图计算好的特征:

Emgu.CV.Features2D.GFTTDetector _GFTTdetector = new Emgu.CV.Features2D.GFTTDetector(500,0.05);
var GFP1 = _GFTTdetector.Detect(FirstImage);

但是,当我调用 .Detect 时,我得到一个 OpenCV 异常,我无法继续:

$exception {"OpenCV: scn == 3 || scn == 4"} Emgu.CV.Util.CvException

有人知道我为什么会得到这个例外吗?

此外,如果有人可以发布如何使用以下函数的示例代码,我将不胜感激,因为我不确定我将使用哪些输入参数:

  • CvInvoke.CalcOpticalFlowPyrLK()
  • CvInvoke.cvFindHomography()
  • CvInvoke.cvWarpPerspective()

最后 _GFTTdetector.Detect() 返回一个 KeyPoint[] 类型,但是 CvInvoke.CalcOpticalFlowPyrLK() 只接受 PointF[] 参数作为优点,那么我如何将 KeyPoint[] 转换为 PointF[]?

4

0 回答 0