我有两个连续的图像,我想在 c# 中使用 EmguCv 来稳定它们。
我找到了很多关于如何执行图像稳定的信息,但是我找不到任何关于如何使用 Emgu 稳定两个连续帧的详细说明(实际代码示例)。
一般来说,我知道我必须执行以下操作:
- 使用 GFTTDetector() 计算第一帧的好特征,得到第一幅图像的好特征点(GFP1)。
- 然后我需要使用 CvInvoke.CalcOpticalFlowPyrLK() 计算光流,以获得第二张图像 (GFP2) 的良好特征点。
- 使用 GFP1 和 GFP2,我可以使用 CvInvoke.cvFindHomography() 函数计算单应矩阵。
- 最后我必须使用 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[]?