2013-09-24 24 views
8

Jak mogę narysować prostokąt z zaokrąglonymi rogami w OpenCV? Wiem, że funkcje ellipse() i line() można po prostu połączyć, aby narysować. Zastanawiam się tylko, czy ktoś zrobił to wcześniej i umieścił go w odpowiedniej funkcji, więc mogę go użyć? Idealnie promień zaokrąglenia jest kalibrowany w parametrze.Jak narysować zaokrąglony prostokąt (prostokąt z zaokrąglonymi narożnikami) za pomocą OpenCV?

Szukałem bardzo dużo, ale wygląda na to, że nikt wcześniej nie miał takiego problemu. Jeśli nikt nie ma takiej funkcji, prawdopodobnie w ciągu kilku dni opublikuję tutaj moje własne rozwiązanie.

Odpowiedz

12

Uświadomiłem sobie, że jest o wiele łatwiej, niż myślałem. Oto moja funkcja. Mam nadzieję, że jest to pomocne dla kogoś.

/** 
* 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

Oto implementacja Pythona (na wypadek gdyby ktoś szukał jednego): rysuje zaokrąglony narożnik (losowego promienia i grubości linii --- zmienić jeśli chcesz) obramowanie wokół obrazu:

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 
Powiązane problemy