【发布时间】:2014-03-06 18:05:07
【问题描述】:
我有一个关于从棋盘上对找到的角进行排序的问题。 我正在使用 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 中查看错误结果 2重点是我的棋盘不会旋转太多,只是旋转一点角度。 第二点是角必须从棋盘左上角的第一个白色方块开始排列。 我知道,基点 (0,0) 位于图像的左上角,Y 的正值在图像底部的方向上增加,X 的正值在右侧的方向上增加图像。
我正在编写程序以获得此排序(这些图片是在图片编辑器中编辑的):
见all pictures中的示例1
见all pictures中的示例2
感谢您的帮助。
【问题讨论】:
-
我将取棋盘的中心点并在中心周围的一个象限中找到每个点。
-
不幸的是,所有链接都已损坏。类似问题请见wiki.bitplan.com/index.php/PlayChessWithAWebCam/…