import cv2
import numpy as np
def drawline(img,pt1,pt2,color,thickness=1,style='dotted',gap=20):
dist =((pt1[0]-pt2[0])**2+(pt1[1]-pt2[1])**2)**.5
pts= []
for i in np.arange(0,dist,gap):
r=i/dist
x=int((pt1[0]*(1-r)+pt2[0]*r)+.5)
y=int((pt1[1]*(1-r)+pt2[1]*r)+.5)
p = (x,y)
pts.append(p)
if style=='dotted':
for p in pts:
cv2.circle(img,p,thickness,color,-1)
else:
s=pts[0]
e=pts[0]
i=0
for p in pts:
s=e
e=p
if i%2==1:
cv2.line(img,s,e,color,thickness)
i+=1
def drawpoly(img,pts,color,thickness=1,style='dotted',):
s=pts[0]
e=pts[0]
pts.append(pts.pop(0))
for p in pts:
s=e
e=p
drawline(img,s,e,color,thickness,style)
def drawrect(img,pt1,pt2,color,thickness=1,style='dotted'):
pts = [pt1,(pt2[0],pt1[1]),pt2,(pt1[0],pt2[1])]
drawpoly(img,pts,color,thickness,style)
im = np.zeros((800,800,3),dtype='uint8')
s=(234,222)
e=(500,700)
drawrect(im,s,e,(0,255,255),1,'dotted')
cv2.imshow('im',im)
cv2.waitKey()
6条答案
按热度按时间u0sqgete1#
qnakjoqk2#
OpenCV(目前)不支持除粗细和抗锯齿之外的线属性。
qmelpv7a3#
xmjla07d4#
正如Adi Shavit和其他人所说的那样,OpenCV目前没有一个用于绘制虚线的内置方法。
不过,有一种变通方法可以用来使用cv2.line()函数绘制虚线。一种方法是绘制带有间隙的短线段,以给予虚线的外观。下面是演示此技术的示例代码片段:
在本例中,从点在黑色图像上绘制绿色虚线(100,100)到点(400,100),厚度为2个像素。segment_length和gap_length变量分别控制线段和间隙的长度。代码计算直线的长度和方向,然后迭代地绘制短线段,在它们之间留有间隙,直到绘制完整条线。可以根据需要调整此方法以生成不同的虚线样式和长度。
另一种方法是使用其他库,如PIL或Pillow,例如:
ct2axkht5#
下面是在Python/OpenCV中绘制虚线的一种方法。
在黑色上画一个白色线条的矩形作为蒙版,然后在蒙版上画一个黑色线条(水平和垂直线条)的网格,在白色线条中放置间隙。线条的粗细将控制间隙。然后使用蒙版在图像上白色线条的地方画黑色
输入:
矩形蒙版:
黑色网格:
网格加厚:
虚线掩码:
结果:
sf6xfgos6#
试试这样的方法: