Emgu 图像转换 - Keystone
Emgu Image Transformation - Keystone
我目前正在尝试使用鱼眼镜头相机进行梯形校正和图像处理。相机指向路径下方的距离,我得到这样的东西,路径在中间 -
View from Camera
我需要实现的是将它转换成这个 -
Image result
我很想用 ImageMagick 来做,但我正在努力将 Mat 或 EMgu Image 变成 ImageMagick Image -
Image<Rgb, byte> image_to_warp = _frame.ToImage<Rgb, Byte>();
int x0 = 0;
int y0 = 0;
int x1 = _frame.Width;
int y1 = 0;
int x2 = _frame.Width;
int y2 = _frame.Height;
int x3 = 0;
int y3 = _frame.Height;
int newX0 = (Int32)new_x0.Value;
int newY0 = (Int32)new_y0.Value;
int newX1 = (Int32)new_x1.Value;
int newY1 = (Int32)new_y1.Value;
int newX2 = (Int32)new_x2.Value;
int newY2 = (Int32)new_y2.Value;
int newX3 = (Int32)new_x3.Value;
int newY3 = (Int32)new_y3.Value;
using (MagickImage image_warped = new MagickImage(image_to_warp))
{
image_warped.Distort(DistortMethod.Perspective, new double[] { x0, y0, newX0, newY0, x1, y1, newX1, newY1, x2, y2, newX2, newY2, x3, y3, newX3, newY3 });
}
然后计划是手动调整拐角,直到我弄直为止。
有没有更简单的方法可以直接使用 Emgu 执行此操作,或者上面的方法是否正确以及您将如何转换图像文件。我已经查看了很多关于如何实现它的选项,但到目前为止还没有得到任何结果。
感谢您的帮助!
编辑:所以目前正在查看如下所述的 FindHomography,但真的很难看出它是如何将两组点联系起来的。我目前有这个 -
camCapture.Image = _frame;
`PointF[] pts_src = new PointF[] { new PointF((0 + newX0), (0 + newY0)), new PointF((_frame.Width + newX1), (0 + newY1)), new PointF((_frame.Width + newX2), (_frame.Height + newY2)), new PointF((_frame.Height + newX3), (0 + newY3)) };
PointF[] pts_dst = new PointF[] { new PointF(0, 0), new PointF(_frame.Width, 0), new PointF(_frame.Width, _frame.Height), new PointF(_frame.Height, 0) };
Mat h = CvInvoke.FindHomography(pts_src, pts_dst);
CvInvoke.WarpPerspective(_frame, _frame, h, _frame.Size);`
基本上使用 Numeric Up down 来获取新的 X0、新的 y0 值,并期望图像一次扭曲一个像素,除非我遗漏了什么,否则它确实不会这样做?
编辑:这确实像我预期的那样工作,但是,我发布的上面的代码不正确,应该阅读 -
`camCapture.Image = _frame;
PointF[] pts_src = new PointF[] { new PointF((0 + newX0), (0 + newY0)), new PointF((_frame.Width + newX1), (0 + newY1)), new PointF((_frame.Width + newX2), (_frame.Height + newY2)), new PointF((0 + newY3),(_frame.Height + newX3)) }; PointF[] pts_dst = new PointF[] { new PointF(0, 0), new PointF(_frame.Width, 0), new PointF(_frame.Width, _frame.Height), new PointF(0, _frame.Height) }; Mat h = CvInvoke.FindHomography(pts_src, pts_dst); CvInvoke.WarpPerspective(_frame, _frame, h, _frame.Size);
您想使用 openCV 的 'cvFindHomography',与 details here
这是一个 good site,其中包含 C++ 示例和 Python,以及其背后的射影平面几何。
我目前正在尝试使用鱼眼镜头相机进行梯形校正和图像处理。相机指向路径下方的距离,我得到这样的东西,路径在中间 -
View from Camera
我需要实现的是将它转换成这个 -
Image result
我很想用 ImageMagick 来做,但我正在努力将 Mat 或 EMgu Image 变成 ImageMagick Image -
Image<Rgb, byte> image_to_warp = _frame.ToImage<Rgb, Byte>();
int x0 = 0;
int y0 = 0;
int x1 = _frame.Width;
int y1 = 0;
int x2 = _frame.Width;
int y2 = _frame.Height;
int x3 = 0;
int y3 = _frame.Height;
int newX0 = (Int32)new_x0.Value;
int newY0 = (Int32)new_y0.Value;
int newX1 = (Int32)new_x1.Value;
int newY1 = (Int32)new_y1.Value;
int newX2 = (Int32)new_x2.Value;
int newY2 = (Int32)new_y2.Value;
int newX3 = (Int32)new_x3.Value;
int newY3 = (Int32)new_y3.Value;
using (MagickImage image_warped = new MagickImage(image_to_warp))
{
image_warped.Distort(DistortMethod.Perspective, new double[] { x0, y0, newX0, newY0, x1, y1, newX1, newY1, x2, y2, newX2, newY2, x3, y3, newX3, newY3 });
}
然后计划是手动调整拐角,直到我弄直为止。 有没有更简单的方法可以直接使用 Emgu 执行此操作,或者上面的方法是否正确以及您将如何转换图像文件。我已经查看了很多关于如何实现它的选项,但到目前为止还没有得到任何结果。
感谢您的帮助!
编辑:所以目前正在查看如下所述的 FindHomography,但真的很难看出它是如何将两组点联系起来的。我目前有这个 - camCapture.Image = _frame;
`PointF[] pts_src = new PointF[] { new PointF((0 + newX0), (0 + newY0)), new PointF((_frame.Width + newX1), (0 + newY1)), new PointF((_frame.Width + newX2), (_frame.Height + newY2)), new PointF((_frame.Height + newX3), (0 + newY3)) };
PointF[] pts_dst = new PointF[] { new PointF(0, 0), new PointF(_frame.Width, 0), new PointF(_frame.Width, _frame.Height), new PointF(_frame.Height, 0) };
Mat h = CvInvoke.FindHomography(pts_src, pts_dst);
CvInvoke.WarpPerspective(_frame, _frame, h, _frame.Size);`
基本上使用 Numeric Up down 来获取新的 X0、新的 y0 值,并期望图像一次扭曲一个像素,除非我遗漏了什么,否则它确实不会这样做?
编辑:这确实像我预期的那样工作,但是,我发布的上面的代码不正确,应该阅读 - `camCapture.Image = _frame;
PointF[] pts_src = new PointF[] { new PointF((0 + newX0), (0 + newY0)), new PointF((_frame.Width + newX1), (0 + newY1)), new PointF((_frame.Width + newX2), (_frame.Height + newY2)), new PointF((0 + newY3),(_frame.Height + newX3)) }; PointF[] pts_dst = new PointF[] { new PointF(0, 0), new PointF(_frame.Width, 0), new PointF(_frame.Width, _frame.Height), new PointF(0, _frame.Height) }; Mat h = CvInvoke.FindHomography(pts_src, pts_dst); CvInvoke.WarpPerspective(_frame, _frame, h, _frame.Size);
您想使用 openCV 的 'cvFindHomography',与 details here
这是一个 good site,其中包含 C++ 示例和 Python,以及其背后的射影平面几何。