如何对找到的棋盘角进行排序?

问题描述 投票:2回答:2

我对从棋盘上找到的边角进行排序有疑问。我正在使用OpenCVSharp在C#中编写程序。

我需要对找到的角点进行排序,这些角点由X和Y描述。这是我的代码的一部分:

...
CvPoint2D32f[] corners;
bool found = Cv.FindChessboardCorners(gray, board_sz, out corners, out corner_count,
    ChessboardFlag.NormalizeImage | ChessboardFlag.FilterQuads);
Cv.FindCornerSubPix(gray, corners, corner_count, new CvSize(11,11), new CvSize(-1,-1),
    Cv.TermCriteria(CriteriaType.Epsilon | CriteriaType.Iteration, 30, 0.1));

Cv.DrawChessboardCorners(img1, board_sz, corners, found);
...

之后,我将在ImageBox中显示找到的角点:

[all pictures]中的

查看良好顺序

这是我一直需要的转角顺序,但是当我稍微旋转棋盘时,发现转角会像这样变化:

[all pictures]中的

看到错误的顺序

我总是需要这些点的顺序相同(如图1所示,所以我决定使用:

var ordered = corners.OrderBy(p => p.Y).ThenBy(p => p.X);
corners = ordered.ToArray();

但是它不能像我想要的那样工作:

看到不良结果1

all pictures

看到不良结果2

all pictures

主要是我的棋盘不会旋转太多,只是稍微旋转一下。第二点是,必须从板左上方的第一个白色正方形开始对角进行排序。我知道,基点(0,0)在图像的左上角,Y的正值在图像底部的方向上增加,而X的正值在图像右侧的方向上增加图片。

我正在使用程序来获得此顺序(这些步骤在图片编辑器中进行了编辑:]

请参见示例1

[all pictures

请参见示例2

[all pictures

感谢您的帮助。

我对从棋盘上找到的边角进行排序有疑问。我正在使用OpenCVSharp在C#中编写程序。我需要对找到的由X和Y描述的角进行排序。这是我的...

c# sorting opencv
2个回答
1
投票

[请在下面的示例中了解OpenCV的findChessboardCorners如何返回角点列表以及drawChessboardCorners如何显示角点。

为了更清楚起见,将订阅四边形的索引的顺序添加为0、1、2、3。


0
投票

处理拉直点。确定图像的斜率,例如,通过获取右上点和左上点的差值。参见Rotation (mathematics)。除了取余弦,您还可以取-diff.Y(减号,因为我们想向后旋转)和diff.X代表正弦。采用这些“错误”值的结果将导致缩放。

© www.soinside.com 2019 - 2024. All rights reserved.