【问题标题】:Drawing full screen chessboard pattern?绘制全屏棋盘图案?
【发布时间】:2019-10-10 00:48:55
【问题描述】:

我在 OpenCV 工作(相机校准然后创建 3d 模型),直到现在我总是在纸上打印棋盘图案,然后拍摄校准所需的照片。我试图找到一种方法以预定义的正方形大小在全屏上绘制图案(因此我可以在校准过程中设置该正方形大小),但我只找到了似乎仅用于绘图的 Python turtle 模块屏幕的一部分,它总是在最后一个方块上画一个箭头。我需要从屏幕边界绘制一些小偏移量的图案,并在这些偏移量内绘制一个带有统一正方形的棋盘。另外,我看到有些人在 GIMP 中绘制图案,但不是全屏。

OpenCV 有 drawChessboardCorners 功能,但它需要从以前导入的图像中建立角点,需要校准,所以我认为它没有意义。

如果有人知道如何解决这个问题,无论是使用某种编程语言(如果可能的话,Python)的一些程序或模块,我将不胜感激。

【问题讨论】:

    标签: python python-3.x opencv camera-calibration


    【解决方案1】:

    在您最喜欢的图形编辑器中准备您的棋盘图案,将文件保存到您要用于显示它以进行校准的计算机上,然后在需要时显示它。我想你可能想多了这个问题......

    【讨论】:

      【解决方案2】:

      我只找到了似乎只用于绘制部分的turtle模块 屏幕,它总是在最后一个正方形上绘制箭头。

      让我们通过在屏幕大小的窗口中绘制一个网格来解决这两个问题,最后一个正方形上没有箭头:

      from turtle import Screen, Turtle
      
      BLOCK_SIZE = 72  # pixels
      CURSOR_SIZE = 20  # pixels
      
      BORDER = 1  # blocks
      
      screen = Screen()
      screen.setup(1.0, 1.0)  # display size window
      width, height = screen.window_width(), screen.window_height()
      screen.setworldcoordinates(0, 0, width, height)
      
      block = Turtle('square', visible=False)  # hide the cursor completely
      block.pencolor('black')
      block.shapesize(BLOCK_SIZE / CURSOR_SIZE)
      block.penup()
      
      x_count = width // BLOCK_SIZE - BORDER * 2
      x_width = x_count * BLOCK_SIZE
      x_start = (width - x_width) // 2
      x_limit = x_width + (BORDER + 1) * BLOCK_SIZE
      
      y_count = height // BLOCK_SIZE - BORDER * 2
      y_height = y_count * BLOCK_SIZE
      y_start = (height - y_height) // 2
      y_limit = y_height + (BORDER + 1) * BLOCK_SIZE
      
      screen.tracer(False)
      
      for parity_y, y in enumerate(range(y_start, y_limit, BLOCK_SIZE)):
          block.sety(y)
      
          for parity_x, x in enumerate(range(x_start, x_limit, BLOCK_SIZE)):
              block.fillcolor(['white', 'black'][(parity_y % 2) == (parity_x % 2)])
              block.setx(x)
              block.stamp()
      
      screen.tracer(True)
      screen.mainloop()
      

      (如果您想覆盖更多屏幕,请在 OS X 中隐藏您的扩展坞。)

      不幸的是,这是以 pixel 为单位绘制的,这是任意的。使用显示器的像素间距值查看我对drawing in a standardized measure 的回答。

      【讨论】:

      • 您好,我觉得这个解决方案还不错,以像素为单位绘制是可以的。唯一的问题是棋盘上没有填充黑白方块,它是全白的,方块之间有黑色边框。在您的代码中,您会将用于填充颜色的循环放在哪里?提前致谢。问候
      • @fjube,我已经输入了一些代码来交替框的颜色。现在看看它是否符合您的需求。
      【解决方案3】:

      这是一个生成棋盘图案的简单代码。但是棋盘的直径是以像素为单位的。

      import numpy as np
      
      h = 6
      w = 8
      size = 100
      checkerboard = 255.0 * np.kron([[1, 0] * (w//2), [0, 1] * (w//2)] * (h//2), np.ones((size, size)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-04
        • 1970-01-01
        • 2014-10-16
        • 1970-01-01
        • 1970-01-01
        • 2016-05-23
        • 1970-01-01
        相关资源
        最近更新 更多