I have a line of code here that uses the python binding for opencv:
cv2.rectangle(img, (box[1], box[0]), (box[3], box[2]), (255,0,0), 4)
This draws a red rectangle on image img
of thickness 4
.
But is there a way the lines of the rectangles can be stylized? Not too much. Just dotted, or dashed, that's it really.
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()
OpenCV does not (currently) support line properties beyond thickness and anti-aliasing.
you can use LineIterator and get any style you want in a few lines of code
void lineDot(OutputArray img, const Point& pt1, const Point& pt2, const Scalar& color, const vector<bool>& pattern){
LineIterator it(img.getMat(), pt1, pt2, LINE_8); // LINE_AA is not supported here
for(auto i=0; i<it.count; i++, it++){
if(pattern[i%pattern.size()]){ // use any pattern of any length, dotted is {0,0,1}, dashed is {0,0,0,1,1,1} etc
(*it)[0] = color.val[0];
(*it)[1] = color.val[1];
(*it)[2] = color.val[2];
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With