OpenCV学习笔记 - OpenCV必知必会的基础(二)

文章目录

  • OpenCV必知必会的基础(二)
    • 绘制基本图形
      • 直线的绘制
      • 矩形的绘制
      • 圆的绘制
      • 椭圆的绘制
      • 多边形的绘制
      • 文本的绘制(字幕)
    • 课程大作业
      • 模块介绍
        • 需求分析
        • 设置回调函数
        • 主程序
      • 作业效果

OpenCV必知必会的基础(二)

绘制基本图形

直线的绘制

  • API:cv2.line(img,pt1,pt2,color[,thickness[,lineType]])
  • 参数说明
    • img: 画线的图像(numpy类型)
    • pt1: 指定线开始的位置
    • pt2: 指定线结束的位置
    • color: 线的颜色设置如:thickness线的粗细,lineType线的类型
  • 代码实例
    ## 创建一个背景图片
    img = np.zeros((640,480,3), np.uint8)
    
    ## 背景图片上画线(设置直线的起点,终点,以及颜色选择,线的粗细程度, 以及线边形状)
    cv2.line(img, (10,20), (10, 400), (0, 0 ,255), 5, 1)
    cv2.line(img, (60,20), (20, 200), (0, 255 ,255), 5, 1)
    
    ## 展示图片
    cv2.imshow('draw',img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

矩形的绘制

  • API:cv2.rectangle(img,pt1,pt2,color[,thickness[,lineType]])
  • 参数说明
    • img: 画线的图像(numpy类型)
    • pt1: 指定矩形左顶点
    • pt2: 指定矩形右顶点
    • color: 线的颜色设置如:thickness线的粗细,lineType线的类型
  • 代码实例
    ## 创建一个背景图片
    img = np.zeros((640,480,3), np.uint8)
    
    ## 背景图片上绘制矩形
    cv2.rectangle(img,(10,10),(100,100),(255,0,0),-1)
    
    ## 展示图片
    cv2.imshow('draw',img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

圆的绘制

  • API: cv2.circle(img, center, radius, color[,thickness[,lineType]])
  • 参数说明
    • img: 画线的图像(numpy类型)
    • center: 圆心
    • radius: 半径
    • color: 线的颜色设置如:thickness线的粗细,lineType线的类型
  • 代码实例
    ## 创建一个背景图片
    img = np.zeros((640,480,3), np.uint8)
    
    ## 背景图片上绘制圆
    cv2.circle(img,(200,200),20,(0,255,0),3)
    
    ## 展示图片
    cv2.imshow('draw',img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

椭圆的绘制

  • API: cv2.ellipse(img,center,axes,angle,startAngle,endAngle)
  • 参数说明
    • img: 画线的图像(numpy类型)
    • center: 绘制椭圆的圆心位置
    • axes: 绘制椭圆长短轴大小
    • angle: 偏转角度
    • startAngle: 两组参数只有在绘制扇形时使用,启始角度
    • endAngle: 两组参数只有在绘制扇形时使用,终止角度
  • 代码实例:
    ## 加载背景图片
    img = np.ones((640,480,3),np.uint8)
    
    ## 在背景图片上绘制椭圆
    cv2.ellipse(img,(100,100),(10,5),0,0,360,(0,255,0))
    
    ## 展示图片
    cv2.imshow('ellipse',img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

多边形的绘制

  • API: cv2.polylines(img,pts,isClosed,color[,thickness[,lineType]])
  • 参数说明
    • img: 画线的图像(numpy类型)
    • pts: 多边形的各个顶点
    • isClosed: 是否为闭合(bool类型)
    • color: 线的颜色设置如:thickness线的粗细,lineType线的类型
  • 代码实例
    ## 创建一个背景图片
    img = np.zeros((640,480,3), np.uint8)
    
    ## 背景图片上绘制多边形
    # 随机初始化多边形顶点(注意顶点坐标数据类型必须是int32否则会报错)
    pts = np.array([(300,10), (150,100), (450, 100)], np.int32)
    cv2.polylines(img, [pts], True, (255,0,0))
    
    ## 展示图片
    cv2.imshow('draw',img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

文本的绘制(字幕)

  • API: cv2.putText(img,text,org,fontFace,fontScale,color[,thickness[,lineType[,bottomLeftOrigin]]])
  • 参数说明
    • img: 画线的图像(numpy类型)
    • text: 绘制的字体(string类型)
    • org: 绘制字体的位置,以文字的左下角为起点
    • fontFace: 表示字体类型
      OpenCV学习笔记 - OpenCV必知必会的基础(二)_第1张图片
    • fontScale: 表示字体大小
    • color: 线的颜色设置如:thickness线的粗细,lineType线的类型,bottomLeftOrigin 用于控制文字的方向。默认为False,当设置为True时,文字时垂直镜像效果
  • 代码实例
    ## 加载背景图片
    img = np.zeros((480,640,3),np.uint8)
    
    ## 在背景图片中添加文字
    cv2.putText(img, 'Hello World',(10,400), cv2.FONT_HERSHEY_PLAIN,1,(255,0,0))
    
    
    ## 展示背景图片
    cv2.imshow('text',img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

课程大作业

模块介绍

需求分析

可以通过鼠标进行基本图形的绘制

  • 可以画线:当用户按下 l l l 键,即选择了画线,此时,滑动鼠标即可画线
  • 可以画矩形: 当用户按下 r r r 键,即选择了画线,此时,滑动鼠标即可画矩形
  • 可以画圆形: 当用户按下 c c c 键,即选择了画线,此时,滑动鼠标即可画圆形

设置回调函数

设置鼠标事件,实现回调函数:参考我们电脑本地的画图软件,先按下鼠标的左键确定绘图的起点拖动,放开鼠标左键确定终点坐标,确定起点和终点的坐标即可绘制出相应的图形,这里我们以绘制线条/矩形/圆形为例子

# 全局变量(curshape=0画线/1画矩形/2画圆)
curshape = 0

## 全局变量起始坐标
startpos = (0,0)

## 回调函数
def mouse_callback(event,x,y,flags,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),(0,0,255))

        elif curshape == 1:
            # 选择画矩形
            cv2.rectangle(img,startpos,(x,y),(255,0,255))
        
        elif curshape == 2:
            # 选择画圆
            a = (x - startpos[0])
            b = (y - startpos[1])
            r = int((a**2+b**2)**0.5)
            cv2.circle(img,startpos,r,(0,255,0))

        else:
            print('error: No Shape')

主程序

## 创建窗口
cv2.namedWindow('drawshape',cv2.WINDOW_NORMAL)
cv2.resizeWindow('drawshape',640,360)

## 设置鼠标事件
cv2.setMouseCallback('drawshape',mouse_callback)

## 显示窗口和背景
img = np.zeros((480,640,3),np.uint8)
while True:
    cv2.imshow('drawshape',img)
    key = cv2.waitKey(1)
    if key & 0xFF == ord('q'):
        break
    elif key & 0xFF == ord('l'):
        # 绘制直线
        curshape = 0

    elif key & 0xFF == ord('r'):
        # 绘制矩形
        curshape = 1
    elif key & 0xFF == ord('c'):
        # 绘制圆
        curshape = 2

cv2.destroyAllWindows()

作业效果

OpenCV学习笔记 - OpenCV必知必会的基础(二)_第2张图片

你可能感兴趣的:(计算机视觉,opencv,学习,计算机视觉)