python-opencv绘图函数(cv2.line(), cv2.circle(), cv2.rectangle(),cv2.ellipse() cv2. cv2.putText() )

第一章3 opencv绘图函数

  • 主要有cv2.line()//画线, cv2.circle()//画圆, cv2.rectangle()//长方形,cv2.ellipse()//椭圆, cv2.putText()//文字绘制

  • 主要参数

  • img:源图像

  • color:需要传入的颜色

  • thickness:线条的粗细,默认值是1

  • linetype:线条的类型,8 连接,抗锯齿等。默认情况是 8 连接。cv2.LINE_AA 为抗锯齿,这样看起来会非常平滑。

    1、画线

    • 画线——设置起点和终点,颜色,线条宽度

      #创建一个图像,300×400大小,数据类型无符号8位
      img=np.zeros((300,400,3),np.uint8)
      cv2.line(img,(10,10),(200,200),(0,255,0),3)#绿色,3个像素宽度
      

      在这里插入图片描述

    2、画矩形

    • 矩形——设置左上顶点和右下顶点,颜色,线条宽度
    cv2.rectangle(img,(10,10),(30,40),(134,2,34),1)
    

    3、画圆

    • 圆——指定圆心和半径
    cv2.circle(img,(60,60),30,(0,0,213),-1)
    

    4、椭圆

    • 画椭圆——需要输入中心点位置,长轴和短轴的长度,椭圆沿逆时针选择角度,椭圆沿顺时针方向起始角度和结束角度
    cv2.ellipse(img,(256,256),(100,50),0,0,180,(20,213,79),-1) #线型-1表示填充
    

    5、多边形

    • 画多边形——需要指定每个顶点的坐标

      import numpy as np
      pts=np.array([[10,3],[48,19],[60,3],[98,19]],np.int32) #数据类型必须是int32
      pts=pts.reshape((-1,1,2)) 
      '''这里 reshape 的第一个参数为-1, 表明这一维的长度是根据后面的维度的计算出来的。
         如果第三个参数是 False,我们得到的多边形是不闭合的(首尾不相连)。
      '''
      cv2.polylines(img,[pts],True,(0,0,255),1) # 图像,点集,是否闭合,颜色,线条粗细
      

      在这里插入图片描述

    6、添加文字

    • 设置参数——绘制的文字,位置,字型,字体大小,文字颜色,线型

      font=cv2.FONT_HERSHEY_SIMPLEX
      cv2.putText(img,’OpenCV’,(80,90), font, 2,(255,255,255),3)
      

      在这里插入图片描述

    7、用鼠标绘制图形

    • opencv鼠标处理事件

    • cv2.setMouseCallback()函数

    • 鼠标事件如下:

      标志数值含义
      cv2.EVENT_MOUSEMOVE0鼠标移动
      cv2.EVENT_LBUTTONDOWN1左键单击
      cv2.EVENT_RBUTTONDOWN2右键单击
      cv2.EVENT_MBUTTONDOWN3中键单击
      cv2.EVENT_LBUTTONUP4左键释放
      cv2.EVENT_RBUTTONUP5右键释放
      cv2.EVENT_MBUTTONUP6中键释放
      cv2.EVENT_LBUTTONDBLCLK7左键双击
      cv2.EVENT_RBUTTONDBLCLK8右键双击
      cv2.EVENT_MBUTTONDBLCLK9中键双击
    • 鼠标事件标志:

      标志数值含义
      cv2.EVENT_FLAG_LBUTTON1鼠标左键按下状态
      cv2.EVENT_FLAG_RBUTTON2鼠标右键按下状态
      cv2.EVENT_FlAG_MBUTTON4鼠标中键按下状态
      cv2.EVENT_FLAG_CTRLKEY8指示CTRL键按下状态
      cv2.EVENT_FLAG_SHIFTKEY16指示SHIFT键按下状态
      cv2.EVENT_FLAG_ALTKEY32指示ALT键按下状态
    • 定义鼠标回调函数

      • 格式都是统一的,不同的是调用后的功能

        def your_mouse_callback(event,x,y,flags,param):

      • 定义完成后需要注册该回调函数

        cv2.setMouseCallback(windowName,your_mouse_callback)

    • 示例——鼠标双击画圆

      import cv2
      import numpy as np
      def CircleCallback(event,x,y,flags,param):
          if event==cv2.EVENT_LBUTTONDBLCLK:
              cv2.circle(img,(x,y),50,(76,201,255),1)
              print('圆心坐标x=:{0},y=:{1}'.format(x,y))
      img=cv2.imread('empire.jpg',1)
      print(img.dtype)
      cv2.namedWindow('mouse_callback')
      cv2.setMouseCallback('mouse_callback',CircleCallback)
      while(True):
          cv2.imshow('mouse_callback',img)
          #这里注意cv2.waitKey()里面等待时间不要写0,否则画面不刷新。切记!!!
          if cv2.waitKey(10)&0xFF==ord('q'):
              break
      cv2.destroyAllWindows()
      

      效果如下:
      在这里插入图片描述

    • 拖动画矩形或者鼠标移动轨迹

      • 检测鼠标是否按下,按下后确定初始点(ix,iy),鼠标按下状态绘制鼠标轨迹,松开后绘制矩形
    • import cv2
      import numpy as np
      
      
      drawing = False  # 鼠标未按下时不绘制
      mode = True  # true时绘制矩形,按'm'变成绘制曲线
      ix, iy = -1, -1
      
      # 定义鼠标回调函数
      
      
      def MouseCallback(event, x, y, flags, param):
          global ix, iy, drawing, mode
          # 按下左键确定鼠标起始位置
          if event == cv2.EVENT_LBUTTONDOWN:
              drawing = True
              ix, iy = x, y
          # 左键按下状态并且移动开始绘制
          elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
              if drawing is True:
                  if mode is False:
                      pass
                      # cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
                  else:
                      # 默认开启绘制鼠标轨迹,按m取消
                      cv2.circle(img, (x, y), 1, (255, 0, 0), -1)
      
          elif event == cv2.EVENT_LBUTTONUP:
              if drawing is True:
                  if mode is True:
                      cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 1)
              drawing = False
      
      
      img = cv2.imread('empire.jpg', 1)
      cv2.namedWindow('rectangle')
      cv2.setMouseCallback('rectangle', MouseCallback)
      while(True):
          cv2.imshow('rectangle', img)
          k = cv2.waitKey(20) & 0xFF
          if k == ord('m'):
              mode = not mode
          elif k == ord('q'):
              break
      
      
  • 30
    点赞
  • 217
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值