用python opencv绘制螺旋正方形

Drawing spiral square with python opencv

我正在尝试使用 OpenCV 和 Numpy 在 python 中绘制一个螺旋正方形。 我知道我可以通过 turtle 做到这一点,互联网上有很多例子,但我需要按照标题中的描述去做。 所以我画了棋盘chessboard via python OpenCV

这是它的代码

import cv2
import numpy as np

mySize = 256
myOffset = 16
mySquare = 32
myNumberY = mySize // mySquare
myNumberX = mySize // mySquare
myColor = 255
img = np.ones((mySize + 2 * myOffset, mySize + 2 * myOffset), dtype = np.uint8) * 127

for y in range(myNumberY) :
    for x in range(myNumberX) :
        myColor = 0 if (x + y) % 2 == 0 else 255
        print(y, x, myColor)
        for ix in range(mySquare) :
            for iy in range(mySquare) :
                img[myOffset + y * mySquare + iy][myOffset + x * mySquare + ix] = myColor
cv2.imshow('my image', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

接下来,我有一些正方形 - 一个在另一个里面。

这是它的代码。

import cv2, numpy

mySize, myOffset, mySquare, myColor = 256, 16, 16, 0

img = numpy.ones((mySize + 2 * myOffset, mySize + 2 * myOffset), dtype = numpy.uint8) * 127

for item in range(mySize // mySquare // 2) :
    myTempOffsetStart = myOffset + item * mySquare
    myTempOffsetFinish = myOffset + mySize - item * mySquare
    myColor = 0 if myColor == 255 else 255
    img[myTempOffsetStart : myTempOffsetFinish, myTempOffsetStart : myTempOffsetFinish] = myColor

cv2.imshow('my image', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

您可以通过更改mySquare值来更改绘图图片(线条)的大小。

所以对我来说重要的是画下图中这样的正方形螺旋。

如果你看图片你会发现图案其实很简单。你必须去 right, up, left, down 并重复几次。此外,您必须走的距离从 3 开始,每隔一步增加 2。

我计算了多少 space 我需要绘制它并移动点以使坐标不为负。这是我的代码:

import cv2
import matplotlib.pyplot as plt
import itertools
import numpy as np

repeates = 10
directions = [(1,0),(0,1),(-1,0),(0,-1)]

moves = [(3+2*(i//2))*np.array(d) 
         for i,d in enumerate(itertools.chain(*itertools.repeat(directions, repeates)))]
points = (np.array([0,0]),*itertools.accumulate(moves))

coordinates = np.array(points).reshape(-1)
r1,r2 = coordinates.min(), coordinates.max()
n = r2-r1+1
img = np.zeros((n,n))

for p,q in zip(points[0:-1],points[1:]):
    cv2.line(img, tuple(p-r1), tuple(q-r1), (1,1,1))

plt.imshow(img, cmap='gray')

看起来像这样