1 绘制直线
import cv2
import numpy as np
img=np.zeros((480,640,3),np.uint8)
#画线坐标(x,y),前面numpy数组的时候坐标是(y,x),要注意
cv2.line(img,(10,20),(400,400),(0,0,255),5,4)
cv2.line(img,(150,20),(540,400),(0,0,255),5,8)
cv2.line(img,(300,20),(640,400),(0,0,255),5,16)
#显示
cv2.imshow("img",img)
key=cv2.waitKey(0)
4,8,16线性型对比,数字越大,越平滑
2 绘制椭圆
可绘制椭圆,扇形;
这里的角度是椭圆的角度,即长方体角度(椭圆在一个矩形内)
import cv2
import numpy as np
img=np.zeros((480,640,3),np.uint8)
#绘制椭圆,0度是从右边开始的
cv2.ellipse(img,(50,300),(100,50),0,0,100,(0,255,0),-1)#椭圆不旋转,画100度(扇形),填充
cv2.ellipse(img,(300,300),(100,50),90,0,45,(0,255,0),-1)#椭圆旋转90,画145度(扇形),填充
cv2.ellipse(img,(500,300),(100,50),0,0,360,(0,255,0))
cv2.ellipse(img,(500,100),(100,50),15,0,360,(0,255,0),-1)#椭圆旋转15,画360度,填充
#显示
cv2.imshow("img",img)
key=cv2.waitKey(0)
3 绘制多边形 及 填充
pts=np.array([(300,10),(150,100),(450,100)],np.int32)#uint32报错,要写成int32
报错
ile "e:\Program_Py\1.py", line 8, in <module>
cv2.polylines(img,[pts],True,(0,0,255),1)
cv2.error: OpenCV(4.5.5) :-1: error: (-5:Bad argument) in function 'polylines'
> Overload resolution failed:
> - Can't parse 'pts'. Sequence item with index 0 has a wrong type
> - Can't parse 'pts'. Sequence item with index 0 has a wrong type
原因,数据类型:#uint32报错,要写成int32
#pts调用时,要加中括号写数组形式,[pts],否则报错
cv2.polylines(img,pts,True,(0,0,255),1)#pts要加中括号写数组形式,[pts],否则报错
#绘制三角形
pts=np.array([(300,10),(150,100),(450,100)],np.int64)#uint32报错,要写成int32,(int8也不行,必须是带符号的32或64)
cv2.polylines(img,[pts],True,(0,0,255))#pts要加中括号写数组形式,[pts],否则报错
cv2.polylines(img,[pts],True,(0,0,255),-1)#线宽试图用-1填充,报错
线宽试图用-1填充,报错
cv2.polylines(img,[pts],True,(0,0,255),-1)
cv2.error: OpenCV(4.5.5) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\drawing.cpp:2029: error: (-215:Assertion failed) pts && npts && ncontours >= 0 && 0 <= thickness && thickness <= MAX_THICKNESS && 0 <=
shift && shift <= XY_SHIFT in function 'cv::polylines'
#多边形填充函数
cv2.fillPoly(img,[pts],(255,0,0))
完整代码
import cv2
import numpy as np
img=np.zeros((480,640,3),np.uint8)
#绘制三角形
pts=np.array([(300,10),(150,100),(450,100)],np.int64)#uint32报错,要写成int32,(int8也不行,必须是带符号的32或64)
cv2.polylines(img,[pts],True,(0,0,255))#pts要加中括号写数组形式,[pts],否则报错
#线宽试图用-1填充,报错
#cv2.polylines(img,[pts],True,(0,0,255),-1)#线宽试图用-1填充,报错
#多边形填充函数
cv2.fillPoly(img,[pts],(255,0,0))
#显示
cv2.imshow("img",img)
key=cv2.waitKey(0)
4 绘制文本
#绘制文本
cv2.putText(img,"trangle",(250,150),cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0))
import cv2
import numpy as np
img=np.zeros((480,640,3),np.uint8)
#绘制三角形
pts=np.array([(300,10),(150,100),(450,100)],np.int64)#uint32报错,要写成int32,(int8也不行,必须是带符号的32或64)
cv2.polylines(img,[pts],True,(0,0,255))#pts要加中括号写数组形式,[pts],否则报错
#线宽试图用-1填充,报错
#cv2.polylines(img,[pts],True,(0,0,255),-1)#线宽试图用-1填充,报错
#多边形填充函数
cv2.fillPoly(img,[pts],(255,0,0))
#绘制文本
cv2.putText(img,"trangle",(250,150),cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0))
#显示
cv2.imshow("img",img)
key=cv2.waitKey(0)
5 鼠标绘制基本图形(直线、圆、矩形)
#基本功能:
#1 画线:当按下l键,即选择了画线。此时,滑动鼠标即可画线。
#2 画矩形:当按下r键,即选择了画矩形。此时,滑动鼠标即可画矩形。
#3 画圆:当按下c键,即选择了画圆。此时,滑动鼠标即可画圆。
#全局变量
curshape=0
startpos=(0,0)
img=np.zeros((480,640,3),np.uint8)
def mouse_callback(event,x,y,flag,userdata):
if event & cv2.EVENT_LBUTTONDOWN == cv2.EVENT_LBUTTONDOWN:
startpos=(x,y)
elif event & cv2.EVENT_LBUTTONUP == cv2.EVENT_LBUTTONUP:
if curshape==0:
cv2.line(img,startpos,(x,y),(255,0,0))#起点startpos,终点是当前x,y
elif curshape==1:
cv2.rectangle(img,startpos,(x,y),(255,0,0))
elif curshape==2:
cv2.circle(img,startpos,max(abs(startpos[0]-x),abs(startpos[1]-y)),(255,0,0))#选择dx,dy中最大值,作为半径
else:
print('error : no shape')
File "e:\Program_Py\1.py", line 25, in mouse_callback
cv2.line(img,startpos,(x,y),(255,0,0))#起点startpos,终点是当前x,y
UnboundLocalError: local variable 'startpos' referenced before assignment
意思是:局部变量’startpos’在赋值前被引用
#全局变量
将全局变量前加上global
global curshape,startpos
name ‘curshape’ is not defined
File "e:\Program_Py\1.py", line 23, in mouse_callback
if curshape==0:
NameError: name 'curshape' is not defined
Traceback (most recent call last):
File "e:\Program_Py\1.py", line 24, in mouse_callback
cv2.line(img,startpos,(x,y),(255,0,0))#起点startpos,终点是当前x,y
UnboundLocalError: local variable 'startpos' referenced before assignment
正确做法,在函数外面定义一次,在函数里面使用的时候,需要再次全局申明
#全局变量
curshape=0
startpos=(0,0)
img=np.zeros((480,640,3),np.uint8)
def mouse_callback(event,x,y,flag,userdata):
global curshape,startpos#需要再次全局申明
startpos=(x,y)
当获取点startpo中x值时,startpos.x,报错
File "e:\Program_Py\1.py", line 29, in mouse_callback
cv2.circle(img,startpos,max(abs(startpos.x-x),abs(startpos.y-y)),(255,0,0))
AttributeError: 'tuple' object has no attribute 'x'
改成,startpos[0],OK
#基本功能:
# 1 画线:当按下l键,即选择了画线。此时,滑动鼠标即可画线。
# 2 画矩形:当按下r键,即选择了画矩形。此时,滑动鼠标即可画矩形。
# 3 画圆:当按下c键,即选择了画圆。此时,滑动鼠标即可画圆。
#curshape:0-drawline,1-drawrectangle,2-drawcircle
import cv2
import numpy as np
#全局变量
curshape=0
startpos=(0,0)
img=np.zeros((480,640,3),np.uint8)
def mouse_callback(event,x,y,flag,userdata):
global curshape,startpos#需要再次全局申明
if event & cv2.EVENT_LBUTTONDOWN == cv2.EVENT_LBUTTONDOWN:
startpos=(x,y)
elif event & cv2.EVENT_LBUTTONUP == cv2.EVENT_LBUTTONUP:
if curshape==0:
cv2.line(img,startpos,(x,y),(255,0,0))#起点startpos,终点是当前x,y
elif curshape==1:
cv2.rectangle(img,startpos,(x,y),(255,0,0))
elif curshape==2:
cv2.circle(img,startpos,max(abs(startpos[0]-x),abs(startpos[1]-y)),(255,0,0))#选择dx,dy中最大值,作为半径
else:
print('error : no shape')
cv2.namedWindow('drawshape',cv2.WINDOW_NORMAL)
cv2.setMouseCallback('drawshape',mouse_callback)
while True:
cv2.imshow("drawshape",img)
key=cv2.waitKey(1) & 0xff
if key == ord('q'):
break
elif key==ord('l'):#line
curshape=0
elif key==ord('r'):#rect
curshape=1
elif key==ord('c'):#circle
curshape=2
当把,函数外面的定义注释掉,也会报错,但是可以使用画图功能;
# #全局变量
# curshape=0
# startpos=(0,0)
img=np.zeros((480,640,3),np.uint8)
def mouse_callback(event,x,y,flag,userdata):
global curshape,startpos#需要再次全局申明
: name ‘curshape’ is not defined
Traceback (most recent call last):
File "e:\Program_Py\1.py", line 23, in mouse_callback
if curshape==0:
NameError: name 'curshape' is not defined