【P31 5】OpenCV Python——图形绘制(line直线、ellipse椭圆、polylines多边形、putText文本),多边形填充fillPoly,鼠标绘制基本图形(直线、圆、矩形)

在这里插入图片描述
在这里插入图片描述

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R-G-B

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值