[英]How to loop translate a cv2.rectangle
我正在使用 cv2.rectangles 尝试在 np.zeros 窗口上绘制网格。 我正在寻找一种使用 for 或 while 循环自动重复绘制这些线条(长而粗的矩形)的方法,直到水平线与窗口底部相交,垂直线与宽度相交。
我希望算法在它们之间填充大小/空间不变的矩形,填充到输入的任何窗口大小的边缘。 所以窗口会改变大小,但每个网格线/正方形的大小不会。
当前代码。
import cv2
import numpy as np
#create np.zeros window
frame = np.zeros((600,600, 3), np.uint8)
width = frame.shape[0]
height = frame.shape[1]
#starting points for vertical line, #earlier while loop wouldn't let me use'<' with tuples
vertp1y = 25
vertp1x = 0
vertp2y = 35
vertp2x = height
#starting points for horizontal lines
horizp1y = 0
horizp1x = 25
horizp2y = width
horizp2x = 35
#pt1 and pt2 parameters set this way to attempting using as variables in later while loop
vert_line=cv2.rectangle(frame, (vertp1y, vertp1x), (vertp2y, vertp2x), (0,225,0), -1)
horiz_line=cv2.rectangle(frame, (horizp1y, horizp1x), (horizp2y, horizp2x), (0,225,0), -1)
while vertp2y < width:
vertp1y = vertp1y + 25
vertp2y = vertp2y + 25
if vertp2y > width:
break
cv2.imshow('frame', frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
当我运行它时,我没有得到任何错误,但是带有两行(矩形)的窗口返回不变。
我还尝试使用 vert_line 作为 src 使用 warpAffine 翻译,同样的问题,返回未更改的窗口。
M = np.float32([[-1,0,25], [0,1,0]])
vert_line_2 = cv2.warpAffine(vert_line, M, (frame.shape[1], frame.shape[0]))
我认为最简单的选择是绘制线条和列而不是矩形。 为此,您可以尝试以下操作:
import matplotlib.pyplot as plt
import numpy as np
class BoxesDrawer:
def __init__(self, box_size: tuple, border_size: int, color: tuple = (0, 255, 0)):
self.box_size = box_size
self.half_border_size = int(border_size // 2)
self.color = color
def draw_on(self, frame: np.asarray) -> np.asarray:
self._draw_row(frame)
self._draw_columns(frame)
return frame
def _draw_row(self, frame: np.asarray) -> np.asarray:
row_size = self.box_size[0]
index = 0
while True:
index += row_size
if index > frame.shape[0]:
break
frame[index - self.half_border_size:index + self.half_border_size, :, :] = self.color
return frame
def _draw_columns(self, frame: np.asarray) -> np.asarray:
column_size = self.box_size[1]
index = 0
while True:
index += column_size
if index > frame.shape[0]:
break
frame[:, index - self.half_border_size:index + self.half_border_size, :] = self.color
return frame
if __name__ == '__main__':
frame = np.zeros((224, 224, 3))
drawer = BoxesDrawer(box_size=(20, 20), border_size=3, color=(0, 255, 0))
drawer.draw_on(frame)
plt.figure()
plt.imshow(frame)
plt.show()
不是一个真正好看的代码,尽管它应该适用于您的用例。 我 100% 确定这可以优化,您甚至可以修改它以更好地适应您的用例,但基线在这里。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.