2013-09-24 22 views
8

Come posso disegnare un rettangolo con angoli arrotondati in OpenCV? So che le funzioni ellipse() e line() possono essere semplicemente messe insieme per disegnarla. Mi chiedo solo se qualcuno l'ha già fatto e l'ha messo in una funzione adeguata, quindi posso usarlo? Idealmente il raggio dell'angolo è quello di calibrare in un parametro.Come disegnare un rettangolo arrotondato (rettangolo con angoli arrotondati) con OpenCV?

ho cercato molto per questo, ma sembra che nessuno ha avuto quel problema prima. Se nessuno ha una tale funzione, probabilmente pubblicherò la mia soluzione qui tra qualche giorno.

risposta

12

Ho capito, questo è molto più facile che ho pensato. Ecco la mia funzione. Spero sia utile per qualcuno.

/** 
* Draws a rectangle with rounded corners, the parameters are the same as in the OpenCV function @see rectangle(); 
* @param cornerRadius A positive int value defining the radius of the round corners. 
* @author K 
*/ 
void rounded_rectangle(Mat& src, Point topLeft, Point bottomRight, const Scalar lineColor, const int thickness, const int lineType , const int cornerRadius) 
{ 
    /* corners: 
    * p1 - p2 
    * |  | 
    * p4 - p3 
    */ 
    Point p1 = topLeft; 
    Point p2 = Point (bottomRight.x, topLeft.y); 
    Point p3 = bottomRight; 
    Point p4 = Point (topLeft.x, bottomRight.y); 

    // draw straight lines 
    line(src, Point (p1.x+cornerRadius,p1.y), Point (p2.x-cornerRadius,p2.y), lineColor, thickness, lineType); 
    line(src, Point (p2.x,p2.y+cornerRadius), Point (p3.x,p3.y-cornerRadius), lineColor, thickness, lineType); 
    line(src, Point (p4.x+cornerRadius,p4.y), Point (p3.x-cornerRadius,p3.y), lineColor, thickness, lineType); 
    line(src, Point (p1.x,p1.y+cornerRadius), Point (p4.x,p4.y-cornerRadius), lineColor, thickness, lineType); 

    // draw arcs 
    ellipse(src, p1+Point(cornerRadius, cornerRadius), Size(cornerRadius, cornerRadius), 180.0, 0, 90, lineColor, thickness, lineType); 
    ellipse(src, p2+Point(-cornerRadius, cornerRadius), Size(cornerRadius, cornerRadius), 270.0, 0, 90, lineColor, thickness, lineType); 
    ellipse(src, p3+Point(-cornerRadius, -cornerRadius), Size(cornerRadius, cornerRadius), 0.0, 0, 90, lineColor, thickness, lineType); 
    ellipse(src, p4+Point(cornerRadius, -cornerRadius), Size(cornerRadius, cornerRadius), 90.0, 0, 90, lineColor, thickness, lineType); 
} 
1

Ecco un'implementazione di Python (nel caso qualcuno stava cercando uno): si disegna un angolo arrotondato (di raggio casuale e lo spessore della linea --- cambiare che se si vuole) bordo attorno a un'immagine:

def addRoundedRectangleBorder(img): 
    height, width, channels = img.shape 

    border_radius = int(width * random.randint(1, 10)/100.0) 
    line_thickness = int(max(width, height) * random.randint(1, 3)/100.0) 
    edge_shift = int(line_thickness/2.0) 

    red = random.randint(230,255) 
    green = random.randint(230,255) 
    blue = random.randint(230,255) 
    color = (blue, green, red) 

    #draw lines 
    #top 
    cv2.line(img, (border_radius, edge_shift), 
    (width - border_radius, edge_shift), (blue, green, red), line_thickness) 
    #bottom 
    cv2.line(img, (border_radius, height-line_thickness), 
    (width - border_radius, height-line_thickness), (blue, green, red), line_thickness) 
    #left 
    cv2.line(img, (edge_shift, border_radius), 
    (edge_shift, height - border_radius), (blue, green, red), line_thickness) 
    #right 
    cv2.line(img, (width - line_thickness, border_radius), 
    (width - line_thickness, height - border_radius), (blue, green, red), line_thickness) 

    #corners 
    cv2.ellipse(img, (border_radius+ edge_shift, border_radius+edge_shift), 
    (border_radius, border_radius), 180, 0, 90, color, line_thickness) 
    cv2.ellipse(img, (width-(border_radius+line_thickness), border_radius), 
    (border_radius, border_radius), 270, 0, 90, color, line_thickness) 
    cv2.ellipse(img, (width-(border_radius+line_thickness), height-(border_radius + line_thickness)), 
    (border_radius, border_radius), 10, 0, 90, color, line_thickness) 
    cv2.ellipse(img, (border_radius+edge_shift, height-(border_radius + line_thickness)), 
    (border_radius, border_radius), 90, 0, 90, color, line_thickness) 

    return img 
Problemi correlati