mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
6.8 KiB
191 lines
6.8 KiB
#!/usr/bin/env python |
|
''' |
|
This program demonstrates OpenCV drawing and text output functions by drawing different shapes and text strings |
|
Usage : |
|
python3 drawing.py |
|
Press any button to exit |
|
''' |
|
|
|
# Python 2/3 compatibility |
|
from __future__ import print_function |
|
|
|
import numpy as np |
|
import cv2 as cv |
|
|
|
# Drawing Lines |
|
def lines(): |
|
for i in range(NUMBER*2): |
|
pt1, pt2 = [], [] |
|
pt1.append(np.random.randint(x1, x2)) |
|
pt1.append(np.random.randint(y1, y2)) |
|
pt2.append(np.random.randint(x1, x2)) |
|
pt2.append(np.random.randint(y1, y2)) |
|
color = "%06x" % np.random.randint(0, 0xFFFFFF) |
|
color = tuple(int(color[i:i+2], 16) for i in (0, 2 ,4)) |
|
arrowed = np.random.randint(0, 6) |
|
if (arrowed<3): |
|
cv.line(image, tuple(pt1), tuple(pt2), color, np.random.randint(1, 10), lineType) |
|
else: |
|
cv.arrowedLine(image, tuple(pt1), tuple(pt2), color, np.random.randint(1, 10), lineType) |
|
cv.imshow(wndname, image) |
|
if cv.waitKey(DELAY)>=0: |
|
return |
|
|
|
# Drawing Rectangle |
|
def rectangle(): |
|
for i in range(NUMBER*2): |
|
pt1, pt2 = [], [] |
|
pt1.append(np.random.randint(x1, x2)) |
|
pt1.append(np.random.randint(y1, y2)) |
|
pt2.append(np.random.randint(x1, x2)) |
|
pt2.append(np.random.randint(y1, y2)) |
|
color = "%06x" % np.random.randint(0, 0xFFFFFF) |
|
color = tuple(int(color[i:i+2], 16) for i in (0, 2 ,4)) |
|
thickness = np.random.randint(-3, 10) |
|
marker = np.random.randint(0, 10) |
|
marker_size = np.random.randint(30, 80) |
|
|
|
if (marker > 5): |
|
cv.rectangle(image, tuple(pt1), tuple(pt2), color, max(thickness, -1), lineType) |
|
else: |
|
cv.drawMarker(image, tuple(pt1), color, marker, marker_size) |
|
cv.imshow(wndname, image) |
|
if cv.waitKey(DELAY)>=0: |
|
return |
|
|
|
# Drawing ellipse |
|
def ellipse(): |
|
for i in range(NUMBER*2): |
|
center = [] |
|
center.append(np.random.randint(x1, x2)) |
|
center.append(np.random.randint(x1, x2)) |
|
axes = [] |
|
axes.append(np.random.randint(0, 200)) |
|
axes.append(np.random.randint(0, 200)) |
|
angle = np.random.randint(0, 180) |
|
color = "%06x" % np.random.randint(0, 0xFFFFFF) |
|
color = tuple(int(color[i:i+2], 16) for i in (0, 2 ,4)) |
|
thickness = np.random.randint(-1, 9) |
|
cv.ellipse(image, tuple(center), tuple(axes), angle, angle-100, angle + 200, color, thickness, lineType) |
|
cv.imshow(wndname, image) |
|
if cv.waitKey(DELAY)>=0: |
|
return |
|
|
|
# Drawing Polygonal Curves |
|
def polygonal(): |
|
for i in range(NUMBER): |
|
pt = [(0, 0)]*6 |
|
pt = np.resize(pt, (2, 3, 2)) |
|
pt[0][0][0] = np.random.randint(x1, x2) |
|
pt[0][0][1] = np.random.randint(y1, y2) |
|
pt[0][1][0] = np.random.randint(x1, x2) |
|
pt[0][1][1] = np.random.randint(y1, y2) |
|
pt[0][2][0] = np.random.randint(x1, x2) |
|
pt[0][2][1] = np.random.randint(y1, y2) |
|
pt[1][0][0] = np.random.randint(x1, x2) |
|
pt[1][0][1] = np.random.randint(y1, y2) |
|
pt[1][1][0] = np.random.randint(x1, x2) |
|
pt[1][1][1] = np.random.randint(y1, y2) |
|
pt[1][2][0] = np.random.randint(x1, x2) |
|
pt[1][2][1] = np.random.randint(y1, y2) |
|
color = "%06x" % np.random.randint(0, 0xFFFFFF) |
|
color = tuple(int(color[i:i+2], 16) for i in (0, 2 ,4)) |
|
alist = [] |
|
for k in pt[0]: |
|
alist.append(k) |
|
for k in pt[1]: |
|
alist.append(k) |
|
ppt = np.array(alist) |
|
cv.polylines(image, [ppt], True, color, thickness = np.random.randint(1, 10), lineType = lineType) |
|
cv.imshow(wndname, image) |
|
if cv.waitKey(DELAY) >= 0: |
|
return |
|
|
|
# fills an area bounded by several polygonal contours |
|
def fill(): |
|
for i in range(NUMBER): |
|
pt = [(0, 0)]*6 |
|
pt = np.resize(pt, (2, 3, 2)) |
|
pt[0][0][0] = np.random.randint(x1, x2) |
|
pt[0][0][1] = np.random.randint(y1, y2) |
|
pt[0][1][0] = np.random.randint(x1, x2) |
|
pt[0][1][1] = np.random.randint(y1, y2) |
|
pt[0][2][0] = np.random.randint(x1, x2) |
|
pt[0][2][1] = np.random.randint(y1, y2) |
|
pt[1][0][0] = np.random.randint(x1, x2) |
|
pt[1][0][1] = np.random.randint(y1, y2) |
|
pt[1][1][0] = np.random.randint(x1, x2) |
|
pt[1][1][1] = np.random.randint(y1, y2) |
|
pt[1][2][0] = np.random.randint(x1, x2) |
|
pt[1][2][1] = np.random.randint(y1, y2) |
|
color = "%06x" % np.random.randint(0, 0xFFFFFF) |
|
color = tuple(int(color[i:i+2], 16) for i in (0, 2 ,4)) |
|
alist = [] |
|
for k in pt[0]: |
|
alist.append(k) |
|
for k in pt[1]: |
|
alist.append(k) |
|
ppt = np.array(alist) |
|
cv.fillPoly(image, [ppt], color, lineType) |
|
cv.imshow(wndname, image) |
|
if cv.waitKey(DELAY) >= 0: |
|
return |
|
|
|
# Drawing Circles |
|
def circles(): |
|
for i in range(NUMBER): |
|
center = [] |
|
center.append(np.random.randint(x1, x2)) |
|
center.append(np.random.randint(x1, x2)) |
|
color = "%06x" % np.random.randint(0, 0xFFFFFF) |
|
color = tuple(int(color[i:i+2], 16) for i in (0, 2 ,4)) |
|
cv.circle(image, tuple(center), np.random.randint(0, 300), color, np.random.randint(-1, 9), lineType) |
|
cv.imshow(wndname, image) |
|
if cv.waitKey(DELAY) >= 0: |
|
return |
|
|
|
# Draws a text string |
|
def string(): |
|
for i in range(NUMBER): |
|
org = [] |
|
org.append(np.random.randint(x1, x2)) |
|
org.append(np.random.randint(x1, x2)) |
|
color = "%06x" % np.random.randint(0, 0xFFFFFF) |
|
color = tuple(int(color[i:i+2], 16) for i in (0, 2 ,4)) |
|
cv.putText(image, "Testing text rendering", tuple(org), np.random.randint(0, 8), np.random.randint(0, 100)*0.05+0.1, color, np.random.randint(1, 10), lineType) |
|
cv.imshow(wndname, image) |
|
if cv.waitKey(DELAY) >= 0: |
|
return |
|
|
|
|
|
def string1(): |
|
textsize = cv.getTextSize("OpenCV forever!", cv.FONT_HERSHEY_COMPLEX, 3, 5) |
|
org = (int((width - textsize[0][0])/2), int((height - textsize[0][1])/2)) |
|
for i in range(0, 255, 2): |
|
image2 = np.array(image) - i |
|
cv.putText(image2, "OpenCV forever!", org, cv.FONT_HERSHEY_COMPLEX, 3, (i, i, 255), 5, lineType) |
|
cv.imshow(wndname, image2) |
|
if cv.waitKey(DELAY) >= 0: |
|
return |
|
|
|
if __name__ == '__main__': |
|
print(__doc__) |
|
wndname = "Drawing Demo" |
|
NUMBER = 100 |
|
DELAY = 5 |
|
width, height = 1000, 700 |
|
lineType = cv.LINE_AA # change it to LINE_8 to see non-antialiased graphics |
|
x1, x2, y1, y2 = -width/2, width*3/2, -height/2, height*3/2 |
|
image = np.zeros((height, width, 3), dtype = np.uint8) |
|
cv.imshow(wndname, image) |
|
cv.waitKey(DELAY) |
|
lines() |
|
rectangle() |
|
ellipse() |
|
polygonal() |
|
fill() |
|
circles() |
|
string() |
|
string1() |
|
cv.waitKey(0) |
|
cv.destroyAllWindows() |