Syntax: cv2.circle(image, center_coordinates, radius, color, thickness) Parameters: image: It is the image on which circle is to be drawn. center_coordinates: It is the center coordinates of circle. The coordinates are represented as tuples of two values i.e. (X coordinate value, Y coordinate value). radius: It is the radius of circle. color: It is the color of border line of circle to be drawn. For BGR, we pass a tuple. eg: (255, 0, 0) for blue color. thickness: It is the thickness of the circle border line in px. Thickness of -1 px will fill the circle shape by the specified color. Return Value: It returns an image.
How to draw a circle over image OpenCV?
StackOverflow question
Im usign python and opencv to get a image from the webcam, and I want to know how to draw a circle over my image, just a simple green circle with transparent fill
import cv2
import numpy
import sys
if __name__ == ’__main__’:
#get current frame from webcam
cam = cv2.VideoCapture(0)
img = cam.read()
#how draw a circle????
cv2.imshow(’WebCam’, img)
cv2.waitKey()
Thanks in advance.
Answer
cv2.circle(img, center, radius, color, thickness=1, lineType=8, shift=0) ‚Üí None
Draws a circle.
Parameters:
img (CvArr) – Image where the circle is drawn
center (CvPoint) – Center of the circle
radius (int) – Radius of the circle
color (CvScalar) – Circle color
thickness (int) – Thickness of the circle outline if positive, otherwise this indicates that a filled circle is to be drawn
lineType (int) – Type of the circle boundary, see Line description
shift (int) – Number of fractional bits in the center coordinates and radius value
Use "thickness" parameter for only the border.
Example #1
def blob(x): """Given an Nx3 matrix of blob positions and size, create N img_size x img_size images, each with a blob drawn on them given by the value in each row of x One row of x = [x,y,radius].""" y = np.zeros((x.shape[0], img_size, img_size)) for i, particle in enumerate(x): rr, cc = skimage.draw.circle( particle[0], particle[1], max(particle[2], 1), shape=(img_size, img_size) ) y[i, rr, cc] = 1 return y #%% # names (this is just for reference for the moment!)
Example #2
def update(self, radarData): self.img = np.zeros((self.height, self.width, self.channels), np.uint8) cv2.line(self.img, (10, 0), (self.width/2 - 5, self.height), (100, 255, 255)) cv2.line(self.img, (self.width - 10, 0), (self.width/2 + 5, self.height), (100, 255, 255)) for track_number in range(1, 65): if str(track_number)+’_track_range’ in radarData: track_range = radarData[str(track_number)+’_track_range’] track_angle = (float(radarData[str(track_number)+’_track_angle’])+90.0)*math.pi/180 x_pos = math.cos(track_angle)*track_range*4 y_pos = math.sin(track_angle)*track_range*4 cv2.circle(self.img, (self.width/2 + int(x_pos), self.height - int(y_pos) - 10), 5, (255, 255, 255)) #cv2.putText(self.img, str(track_number), # (self.width/2 + int(x_pos)-2, self.height - int(y_pos) - 10), self.font, 1, (255,255,255), 2) cv2.imshow("Radar", self.img) cv2.waitKey(2)
Example #3
def ProcessFrame(self, frame): # segment arm region segment = self.SegmentArm(frame) # make a copy of the segmented image to draw on draw = cv2.cvtColor(segment, cv2.COLOR_GRAY2RGB) # draw some helpers for correctly placing hand cv2.circle(draw,(self.imgWidth/2,self.imgHeight/2),3,[255,102,0],2) cv2.rectangle(draw, (self.imgWidth/3,self.imgHeight/3), (self.imgWidth*2/3, self.imgHeight*2/3), [255,102,0],2) # find the hull of the segmented area, and based on that find the # convexity defects [contours,defects] = self.FindHullDefects(segment) # detect the number of fingers depending on the contours and convexity defects # draw defects that belong to fingers green, others red [nofingers,draw] = self.DetectNumberFingers(contours, defects, draw) # print number of fingers on image cv2.putText(draw, str(nofingers), (30,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255)) return draw
Example #4
def mark_hand_center(frame_in,cont): max_d=0 pt=(0,0) x,y,w,h = cv2.boundingRect(cont) for ind_y in xrange(int(y+0.3*h),int(y+0.8*h)): #around 0.25 to 0.6 region of height (Faster calculation with ok results) for ind_x in xrange(int(x+0.3*w),int(x+0.6*w)): #around 0.3 to 0.6 region of width (Faster calculation with ok results) dist= cv2.pointPolygonTest(cont,(ind_x,ind_y),True) if(dist>max_d): max_d=dist pt=(ind_x,ind_y) if(max_d>radius_thresh*frame_in.shape[1]): thresh_score=True cv2.circle(frame_in,pt,int(max_d),(255,0,0),2) else: thresh_score=False return frame_in,pt,max_d,thresh_score # 6. Find and display gesture
Example #5
def update(self, radarData): self.img = np.zeros((self.height, self.width, self.channels), np.uint8) cv2.line(self.img, (10, 0), (self.width/2 - 5, self.height), (100, 255, 255)) cv2.line(self.img, (self.width - 10, 0), (self.width/2 + 5, self.height), (100, 255, 255)) for track_number in range(1, 65): if str(track_number)+’_track_range’ in radarData: track_range = radarData[str(track_number)+’_track_range’] track_angle = (float(radarData[str(track_number)+’_track_angle’])+90.0)*math.pi/180 x_pos = math.cos(track_angle)*track_range*4 y_pos = math.sin(track_angle)*track_range*4 cv2.circle(self.img, (self.width/2 + int(x_pos), self.height - int(y_pos) - 10), 5, (255, 255, 255)) #cv2.putText(self.img, str(track_number), # (self.width/2 + int(x_pos)-2, self.height - int(y_pos) - 10), self.font, 1, (255,255,255), 2) cv2.imshow("Radar", self.img) cv2.waitKey(2)
Archived version
OpenCV-Python —¬†is a Python bindings library for solving computer vision problems.¬† cv2.circle ()
is used to draw a circle on any image.
Syntax: cv2.circle (image, center_coordinates, radius, color , thickness) Parameters: image: It is the image on which circle is to be drawn. center_coordinates: It is the center coordinates of circle. The coordinates are represented as tuples of two values ​​ie ( X coordinate value, Y coordinate value). radius: It is the radius of circle. color: It is the color of border line of circle to be drawn. For BGR , we pass a tuple. eg: (255, 0, 0) for blue color. thickness: It is the thickness of the circle border line in px . Thickness of -1 px will fill the rectangle shape by the specified color. Return Value: It returns an image. The image is used for all examples below:Example # 1:
Output:
# Python program to explain the cv2.circle () method
 # cv2 import
import
cv2 
 # path
path
=
r
’C: UsersRajnishDesktoppythonengineeringgeeks.png’
 
 # Read image in default mode
image
=
cv2.imread (path)
 # Name of the window in which the image is displayed
window_name
=
’Image’
 
 # Center coordinates
center_coordinates
=
(
120
,
50
)
 # Circle radius
radius
=
20
 
 # Blue color in BGR
color
=
(
255
,
0
,
0
)
 # Line width 2 px
thickness
=
2
 # Using the cv2.circle () method
# Draw a circle with a 2 px blue border
image
=
cv2.circle (image, center_coordinates, radius, color, thickness)
 # Display image
cv2.imshow (window_name, image) 
Example # 2: Using -1 px thickness to fill the rectangle with red.
# Python program to explain the cv2.circle () method
 # cv2 import
import
cv2 
 # path
path
=
r
’C: UsersRajnishDesktoppythonengineeringgeeks.png’
 # Read image in default mode
image
=
cv2.imread (path)
 # Name of the window in which the image is displayed
window_name
=
’Image’
 
 # Center coordinates
center_coordinates
=
(
120
,
100
)
 
 # Circle radius
radius
=
30
 
 # Red in BGR
color
=
(
0
,
0
,
255
)
 # Line thickness -1 px
thickness
=
-
1
 # Using the cv2.circle () method
# Draw a -1 px red circle
image
=
cv2.circle (image, center_coordinates, radius, color, thickness)
< code class = "undefined spaces">  # Displaying an image
cv2.imshow (window_name, image ) 
 Output:
Python OpenCV | cv2.circle () method around: Questions
Removing white space around a saved image in matplotlib
2 answers
I need to take an image and save it after some process. The figure looks fine when I display it, but after saving the figure, I got some white space around the saved image. I have tried the "tight"
option for savefig
method, did not work either. The code:
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
fig = plt.figure(1)
img = mpimg.imread(path)
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig("1.png", bbox_inches=extent)
plt.axis("off")
plt.show()
I am trying to draw a basic graph by using NetworkX on a figure and save it. I realized that without a graph it works, but when added a graph I get white space around the saved image;
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import networkx as nx
G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edge(1,3)
G.add_edge(1,2)
pos = {1:[100,120], 2:[200,300], 3:[50,75]}
fig = plt.figure(1)
img = mpimg.imread("image.jpg")
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
nx.draw(G, pos=pos)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig("1.png", bbox_inches = extent)
plt.axis("off")
plt.show()
Answer #1
You can remove the white space padding by setting bbox_inches="tight"
in savefig
:
plt.savefig("test.png",bbox_inches="tight")
You"ll have to put the argument to bbox_inches
as a string, perhaps this is why it didn"t work earlier for you.
Possible duplicates:
Matplotlib plots: removing axis, legends and white spaces
Answer #2
I cannot claim I know exactly why or how my “solution” works, but this is what I had to do when I wanted to plot the outline of a couple of aerofoil sections — without white margins — to a PDF file. (Note that I used matplotlib inside an IPython notebook, with the -pylab flag.)
plt.gca().set_axis_off()
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0,
hspace = 0, wspace = 0)
plt.margins(0,0)
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.savefig("filename.pdf", bbox_inches = "tight",
pad_inches = 0)
I have tried to deactivate different parts of this, but this always lead to a white margin somewhere. You may even have modify this to keep fat lines near the limits of the figure from being shaved by the lack of margins.
Python OpenCV | cv2.circle () method circle: Questions
How to do a scatter plot with empty circles in Python?
2 answers
In Python, with Matplotlib, how can a scatter plot with empty circles be plotted? The goal is to draw empty circles around some of the colored disks already plotted by scatter()
, so as to highlight them, ideally without having to redraw the colored circles.
I tried facecolors=None
, to no avail.
Answer #1
From the documentation for scatter:
Optional kwargs control the Collection properties; in particular:
edgecolors:
The string ‘none’ to plot faces with no outlines
facecolors:
The string ‘none’ to plot unfilled outlines
Try the following:
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randn(60)
y = np.random.randn(60)
plt.scatter(x, y, s=80, facecolors="none", edgecolors="r")
plt.show()
Note: For other types of plots see this post on the use of markeredgecolor
and markerfacecolor
.
plot a circle with pyplot
2 answers
surprisingly I didn"t find a straight-forward description on how to draw a circle with matplotlib.pyplot (please no pylab) taking as input center (x,y) and radius r. I tried some variants of this:
import matplotlib.pyplot as plt
circle=plt.Circle((0,0),2)
# here must be something like circle.plot() or not?
plt.show()
... but still didn"t get it working.
Answer #1
You need to add it to an axes. A Circle
is a subclass of an Patch
, and an axes
has an add_patch
method. (You can also use add_artist
but it"s not recommended.)
Here"s an example of doing this:
import matplotlib.pyplot as plt
circle1 = plt.Circle((0, 0), 0.2, color="r")
circle2 = plt.Circle((0.5, 0.5), 0.2, color="blue")
circle3 = plt.Circle((1, 1), 0.2, color="g", clip_on=False)
fig, ax = plt.subplots() # note we must use plt.subplots, not plt.subplot
# (or if you have an existing figure)
# fig = plt.gcf()
# ax = fig.gca()
ax.add_patch(circle1)
ax.add_patch(circle2)
ax.add_patch(circle3)
fig.savefig("plotcircles.png")
This results in the following figure:
The first circle is at the origin, but by default clip_on
is True
, so the circle is clipped when ever it extends beyond the axes
. The third (green) circle shows what happens when you don"t clip the Artist
. It extends beyond the axes (but not beyond the figure, ie the figure size is not automatically adjusted to plot all of your artists).
The units for x, y and radius correspond to data units by default. In this case, I didn"t plot anything on my axes (fig.gca()
returns the current axes), and since the limits have never been set, they defaults to an x and y range from 0 to 1.
Here"s a continuation of the example, showing how units matter:
circle1 = plt.Circle((0, 0), 2, color="r")
# now make a circle with no fill, which is good for hi-lighting key results
circle2 = plt.Circle((5, 5), 0.5, color="b", fill=False)
circle3 = plt.Circle((10, 10), 2, color="g", clip_on=False)
ax = plt.gca()
ax.cla() # clear things for fresh plot
# change default range so that new circles will work
ax.set_xlim((0, 10))
ax.set_ylim((0, 10))
# some data
ax.plot(range(11), "o", color="black")
# key data point that we are encircling
ax.plot((5), (5), "o", color="y")
ax.add_patch(circle1)
ax.add_patch(circle2)
ax.add_patch(circle3)
fig.savefig("plotcircles2.png")
which results in:
You can see how I set the fill of the 2nd circle to False
, which is useful for encircling key results (like my yellow data point).