我对从棋盘上找到的边角进行排序有疑问。我正在使用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所示,所以我决定使用:
在all picturesvar ordered = corners.OrderBy(p => p.Y).ThenBy(p => p.X); corners = ordered.ToArray();
但是它不能像我想要的那样工作:
看到不良结果1
看到不良结果2
在all pictures主要是我的棋盘不会旋转太多,只是稍微旋转一下。第二点是,必须从板左上方的第一个白色正方形开始对角进行排序。我知道,基点(0,0)在图像的左上角,Y的正值在图像底部的方向上增加,而X的正值在图像右侧的方向上增加图片。
我正在使用程序来获得此顺序(这些步骤在图片编辑器中进行了编辑:]
请参见示例1
[all pictures请参见示例2
[all pictures感谢您的帮助。
我对从棋盘上找到的边角进行排序有疑问。我正在使用OpenCVSharp在C#中编写程序。我需要对找到的由X和Y描述的角进行排序。这是我的...
[请在下面的示例中了解OpenCV的findChessboardCorners如何返回角点列表以及drawChessboardCorners如何显示角点。
为了更清楚起见,将订阅四边形的索引的顺序添加为0、1、2、3。
处理拉直点。确定图像的斜率,例如,通过获取右上点和左上点的差值。参见Rotation (mathematics)。除了取余弦,您还可以取-diff.Y
(减号,因为我们想向后旋转)和diff.X
代表正弦。采用这些“错误”值的结果将导致缩放。