opencv rectangle with dotted or dashed lines

后端 未结 4 688
不知归路
不知归路 2020-12-19 00:58

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)

Th

相关标签:
4条回答
  • 2020-12-19 01:22

    Try something like this:

    cv::Point P1, P2;
    
    P1.y = 50;
    P2.y = 50;
    
    int dot_gap = 50;
    int dot_width = 50;
    
    for( int i=0 ; i < in_img.cols; (i = i+d_width) ) {
    
        P1.x = i;
        P2.x = i + dot_width;
        cv::line(in_img, P1, P2, cv::Scalar(0, 255, 255), 2, cv::LINE_8);
    }
    
    0 讨论(0)
  • 2020-12-19 01:34
    • openCV is opensource library so you can find source code for drawing and modify it slightly
    • 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];
              }
          }
      }
      
    0 讨论(0)
  • 2020-12-19 01:38
    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()      
    
    0 讨论(0)
  • 2020-12-19 01:42

    OpenCV does not (currently) support line properties beyond thickness and anti-aliasing.

    0 讨论(0)
提交回复
热议问题