gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:59:18 25 4
gpt4 key购买 nike

我有一个关于从棋盘中排序找到的角的问题。我正在使用 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();

但它并没有像我想要的那样工作:

all pictures 中查看错误结果 1

all pictures 中查看错误结果 2

重点是我的棋盘不会旋转太多,只是旋转了一个小角度。第二点是角落必须从棋盘左上角的第一个白色方 block 开始排序。我知道,基点 (0,0) 位于图像的左上角,Y 的正值在图像底部的方向上增加,X 的正值在右侧的方向上增加图像。

我正在编写程序以获得此顺序(这些图片是在图片编辑器中编辑的):

参见 all pictures 中的示例 1

参见 all pictures 中的示例 2

感谢您的帮助。

最佳答案

请在下面找到一些示例,了解 OpenCV 的 findChessboardCorners 如何返回角点列表以及 drawChessboardCorners 如何显示角点。

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

基本上有 4 种可能的结果旋转导致初始红色标记为:

  • 左上角
  • 右上角
  • 左下
  • 右下

因此,当您想要求助时,您可以考虑这些知识并相应地更改索引的顺序。好消息是,使用这种方法,您不必查看所有 x,y 值。比较列表中的第一个值和最后一个值就足以找出旋转是什么。

为了简化排序,您可能希望将列表“ reshape ”为适合您在第一个位置提供给 findChessBoardCorners 的国际象棋模式的数组,例如9x9。在 Python numpy 中有一个函数,我不知道如何在 C# 中完成。

example 1 example 2

关于c# - 如何对找到的棋盘角进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22232470/

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