【问题标题】:Shape of corners array returned by findChessboardCorners()findChessboardCorners() 返回的角数组的形状
【发布时间】:2021-06-14 14:34:01
【问题描述】:

我成功使用了OpenCV函数findChessboardCorners(),但是我对corners返回值的形状感到困惑。

下面是我的代码。我已经知道我的棋盘图像有 8 x 6 内角。

import cv2

nx = 8
ny = 6

img = cv2.imread('test_image2.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, corners = cv2.findChessboardCorners(img, (nx, ny), None)
print(corners.shape)

最后一行打印:(48, 1, 2)

1 来自哪里?我知道有 8 * 6 = 48 角,每个角都有 2 坐标。但是1 呢?

documentation for findChessboardCorners() 没有说明corners 结果:

corners – Output array of detected corners.

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    这是一个不需要的和不必要的维度,您可以使用numpysqueeze function消除该维度:

     corners = np.squeeze(corners) 
    

    this documentation,他们还在评论行中提到了“extraneous singleton dimension”

    corners = np.squeeze(corners) # 去掉无关的单例维度

    编辑:

    我只是将代码切换到 C++ 端进行深入研究。最后,这是它的代码和控制台输出:

    std::ccorners<<corners.rows<<"  "<<corners.cols<<"  "<<corners.dims<<std::endl;
    

    输出:

    48 1  2
    

    所以你得到的输出分别给出:

    • 行数 -> 角数
    • 列号 -> 默认为 1,因为只有一个数据要给出
    • 矩阵维数->为2,每行数据对数(坐标)

    【讨论】:

    • 我不知道这是否是一个“不必要的”维度。我只是想了解它为什么会在那里。
    • @stackoverflowuser2010 我编辑了我的答案,1 代表角输出数组的维数
    • 谢谢。我还是不明白corners.cols 是什么意思。如果corners.cols 是 3,这是否意味着每个角有三个 (x,y) 坐标?如果是这样,那将如何发生?
    • 其实,如果你打印角的大小,你会得到 1x48,这意味着 1 是列号,48 是行号。所以我们知道矩阵每列包含 2 个数据对(在这种情况下为 x 和 y)
    • 这是一个有趣的假设。我将8x6 棋盘角的参数传递给findChessboardCorners()。我想知道为什么corners.colcorners.rows 不是68(反之亦然)。为什么是148?这似乎不直观。
    猜你喜欢
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    相关资源
    最近更新 更多