gpt4 book ai didi

c# - 从一组四个点中对齐两个图像

转载 作者:行者123 更新时间:2023-11-30 15:27:14 25 4
gpt4 key购买 nike

我正在用 C# 在 accord.net 中玩耍,并试图对齐两个图像。我是计算机视觉的新手,想知道 accord.net 是否可以做到这一点,或者我是否必须自己编写一些东西。

我有两张图片,每张图片有四个点。这些点从左上角开始围绕图像逆时针分配 (TL, TR, BR, BL)

例子:

图片 1

Point 1(221, 156)
Point 2(4740, 156)
Point 3(4740, 3347)
Point 4(221, 3347)

Image 1 - Box

图 2

Point 1(157, 213)
Point 2(4572, 32)
Point 3(4697, 3221)
Point 4(282, 3402)

Image 2 - Box rotated and scaled down

在两个图像中,图像 1 的点 1 与图像 2 的点 1 相关,其余点相同。

所以我想做的是对齐两个图像,使两个图像之间的比例、旋转和对齐匹配,当叠加时我最终得到两个图像,应该如下图所示:

Result

到目前为止,我已经有了这个,它适用于旋转和对齐,但不能缩放图像。根据我的理解,RANSAC 似乎已经完成了这项工作,因为我已经将这些观点联系起来了?另外,我希望单独输出图像以进行进一步的图像处理。

// Images
var img1Path = Path.Combine(filePath, "image1.jpg");
var image1 = new[] { new PointF(221, 156), new PointF(4740, 156), new PointF(4740, 3347), new PointF(221, 3347) };

var img2Path = Path.Combine(filePath, "image2.jpg");
var image2 = new[] { new PointF(157, 213), new PointF(4572, 32), new PointF(4697, 3221), new PointF(282, 3402) };

// Create Bitmaps
var img1 = new Bitmap(img1Path);
var img2 = new Bitmap(img2Path);

var ransac = new RansacHomographyEstimator(0.001, 0.99);
var homographyMatrix = ransac.Estimate(image1, image2);

var blend = new Blend(homographyMatrix, img1) { Gradient = false };
var result = blend.Apply(img2);

result.Save("out.jpg", ImageFormat.Jpeg);

谢谢!

最佳答案

答案原来是有几个点是错误的,导致图像内容无法缩放,这是一个愚蠢但值得庆幸的简单错误。

其次,要让 accord.net 将输出保存为单独的图像,您可以使用以下代码:

var filter = new Rectification(homographyMatrix);
var result = filter.Apply(image);
result.Save("out.jpg", ImageFormat.Jpeg);

感谢 ezfn,我也在 emguCV 中实现了这个功能,但是论坛帖子不完整,我解决了这个缺失的代码,并在此处完成:

var srcImagePath = Path.Combine(FilePath, "image2.jpg");
var dstImagePath = Path.Combine(FilePath, "image1.jpg");

var srcImage = new Image<Bgr, int>(srcImagePath);
var dstImage = new Image<Bgr, int>(dstImagePath);

float[,] srcPoints = { { 221, 156 }, { 4740, 156 }, { 4740, 3347 }, { 221, 3347 } };
float[,] dstPoints = { { 371, 356 }, { 4478, 191 }, { 4595, 3092 }, { 487, 3257 } };

var srcMat = new Matrix<float>(srcPoints);
var dstMat = new Matrix<float>(dstPoints);

var homogMat = new Matrix<float>(3, 3);
var invertHomogMat = new Matrix<float>(3, 3);
var maskMat = new IntPtr();

var s = new MCvScalar(0, 0, 0);

// .Ptr?
CvInvoke.cvFindHomography(srcMat, dstMat, homogMat, HOMOGRAPHY_METHOD.DEFAULT, 3.0, maskMat);
CvInvoke.cvInvert(homogMat, invertHomogMat, SOLVE_METHOD.CV_LU);
CvInvoke.cvWarpPerspective(srcImage, dstImage, invertHomogMat, (int)INTER.CV_INTER_NN, s);

dstImage.Save("2.jpg");

感谢大家的帮助!

关于c# - 从一组四个点中对齐两个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27897857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com