学习opencv-python记录1:画图

首先要

import cv2

读入图像

使用函数 cv2.imread(filename, flag=None) 读入图像。

  • cv2.IMREAD_COLOR:读入一副彩色图像。图像的透明度会被忽略,这是默认参数。
  • cv2.IMREAD_GRAYSCALE:以灰度模式读入图像
  • cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha 通道
img = cv2.imread('IMG3.jpg', 0)

显示图像

使用函数 cv2.imshow(winname, mat) 显示图像。窗口会自动调整为图像大小。第一个参数是窗口的名字,其次才是我们的图像。你可以创建多个窗口,只要你喜欢,但是必须给他们不同的名字。

cv2.imshow('chunjiao', img)
cv2.waitKey(0) # 是一个键盘绑定函数。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运行。如果没有键盘输入,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会无限期的等待键盘输入。
cv2.destroyAllWindows() # 可以轻易删除任何我们建立的窗口。如果你想删除特定的窗口可以使用 

保存图像

使用cv2.imwrite(filename, img, params=None)来保存一个图像。

综上例子:

img = cv2.imread('IMG3.jpg', 0)
cv2.imshow('chunjiao', img)
k = cv2.waitKey(0)
if k == 27:   # 等待输入esc键来退出
    cv2.destroyAllWindows()
elif k == ord('s'):  # 等待输入s键来保存并且退出
    cv2.imwrite('CJgray.png', img)
    cv2.destroyAllWindows()

从文件中播放视频

cap.read() 返回一个布尔值(True/False)。如果帧读取的是正确的,就是 True。所以最后你可以通过检查他的返回值来查看视频文件是否已经到了结尾。

在播放每一帧时,使用 cv2.waiKey() 设置适当的持续时间。如果设置的太低视频就会播放的非常快,如果设置的太高就会播放的很慢(你可以使用这种方法控制视频的播放速度)。通常情况下 25 毫秒就可以了。

cap = cv2.VideoCapture('shipin.mp4')

while(cap.isOpened()):
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame', gray)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

保存视频

要创建一个 VideoWriter 的对象。我们应该确定一个输出文件的名字。接下来指定 FourCC 编码(下面会介绍)。播放频率和帧的大小也都需要确定。最后一个是 isColor 标签。如果是 True,每一帧就是彩色图,否则就是灰度图。
FourCC 就是一个 4 字节码,用来确定视频的编码格式。可用的编码列表可以从fourcc.org查到。这是平台依赖的。In Windows: DIVX.

# 从文件获取视频,沿水平方向旋转每一帧并保存它。
cap = cv2.VideoCapture('shipin.mp4')

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame, 0)
        out.write(frame)
        cv2.imshow('frame',frame)
        if cv2.waitKey(25) & 0xFF == ord('q'):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()

绘图函数

所 有 的 绘 图 函 数 的 返 回 值 都 是 None, 所 以 不 能 使 用 img =cv2.line(img,(0,0),(511,511),(255,0,0),5) 

画线

cv2.line(img, pt1, pt2, color, thickness=None, lintType=None, shift=None)

  • img:你想要绘制图形的那幅图像。
  • pt1:  直线起点
  • pt2:  直线终点
  • color:形状的颜色。以 RGB 为例,需要传入一个元组,例如: (255,0,0 )代表蓝色。对于灰度图只需要传入灰度值。
  • thickness:线条的粗细。如果给一个闭合图形设置为 -1,那么这个图形就会被填充。默认值是 1.
  • linetype:线条的类型,8 连接,抗锯齿等。默认情况是 8 连接。cv2.LINE_AA为抗锯齿,这样看起来会非常平滑.
  • shift:  坐标点小数点位数
import cv2
import numpy as np

img = np.zeros((512, 512, 3), np.uint8) 
# 使用np.zeros()方法构造了一个512*512的NumPy数组,同时分配了三个颜色空间:R、G、B,这个方法用0填充了这个数组的每一个元素。np.zeros()的第二个变量是数据类型:dtype。由于我们需要用RGB格式来表示我们的图像,取值范围是[0,255],所以用“uint8”,如果不声明的话np.zeros()默认的变量类型是float64.
cv2.line(img, (0,0), (511, 511), (255, 0, 0), 5)
cv2.line(img, (23, 40),(190, 400), (139,222, 10), 3, cv2.LINE_AA)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

画矩形

cv2.rectangle(img, pt1, pt2, color, thickness=None, lintType=None, shift=None)

需要告诉函数的pt1:左上角顶点和pt2:右下角顶点的坐标。

cv2.rectangle(img, (384,0), (510, 128), (0,255,0),3)

画圆

cv2.circle(img, center, radius, color, thickness=None, lineType=None, shift=None)

指定圆形的中心点坐标和半径大小.

cv2.circle(img, (447, 63), 63, (0,0,255), -1) # -1表示闭合实心

画椭圆

cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color,thickness =None, lineType=None, shift=None)

一个参数是中心点的位置坐标。一个参数是长轴和短轴的长度。椭圆沿逆时针方向旋转的角度。椭圆弧演顺时针方向起始的角度和结束角度,如果是 0 或 360,就是整个椭圆。

cv2.ellipse(img, (256, 256), (100,50),0, 0,180,255, -1)

画多边形

cv2.polylines()

画多边形,需要指点每个顶点的坐标。用这些点的坐标构建一个数组,行数就是点的数目。这个数组的数据类型必须为 int32。

pts = np.array([[10,5],[120,30],[170,100],[50,80]], np.int32) 
pts = pts.reshape((-1,1,2)) # -1表示不知道多少个的矩阵,1行2列.
cv2.polylines(img, [pts], True, (0,255,255)) # 如果不打中括号,则画出来是4个点。如果第三个参数是 False,我们得到的多边形是不闭合的(首尾不相连)

在图片上添加文字

cv2.putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)

  • 你要绘制的文字
  • 你要绘制的位置
  • 字体类型(通过查看 cv2.putText() 的文档找到支持的字体)
  • 字体的大小
  • 文字的一般属性如颜色,粗细,线条的类型等。为了更好看一点推荐使用linetype=cv2.LINE_AA。
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'OpenCV', (10,500), font, 4,(255, 255, 255), 2, cv2.LINE_AA)

把鼠标当画笔

cv2.setMouseCallback():  创建一个鼠标回调函数,该函数在鼠标事件发生时执行。鼠标事件可以是与鼠标相关的任何内容,如左键向下,左键向上,左键双击等。它为我们提供了每个鼠标事件的坐标(x,y)。

import cv2
import numpy as np

def draw_circle(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img, (x,y), 100, (255, 0, 0), -1) # 鼠标双击的地方画一个实心圆

img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)
while(1):
    cv2.imshow('image', img)
    if cv2.waitKey(20) & 0xFF == 27:
        break

cv2.destroyAllWindows()

在拖动鼠标时绘制矩形或者是圆圈(就像画图程序中一样)。所以我们的回调函数包含两部分,一部分画矩形,一部分画由圆圈组成的曲线。

import cv2
import numpy as np

drawing = False #  若鼠标按下则为True
mode = True # 如果是True则画矩形,按m切换画曲线
ix, iy = -1, -1

def draw_circle(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:
        if drawing == True:
            if mode == True:
                # cv2.rectangle(img,(ix, iy), (x, y), (0, 255, 0), -1) # 这句是画实心矩形的
                pass
            else:
                cv2.circle(img, (x,y), 5, (0, 0, 255), -1)

    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        if mode == True:
            cv2.rectangle(img, (ix, iy), (x,y), (0,255,0), 1)
        else:
            cv2.circle(img, (x,y), 5, (0,0,255),-1)

img = np.zeros((500, 750, 3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)
while(1):
    cv2.imshow('image', img)
    k = cv2.waitKey(1) & 0xFF
    if k == ord('m'): #切换模式
        mode = not mode
    elif k == 27:
        break

cv2.destroyAllWindows()

用滑动条做调色板

 cv2.getTrackbarPos() 函数:

第一个参数是滑动条的名字。第二个参数是滑动条被放置窗口的名字。第三个参数是滑动条的默认位置。第四个参数是滑动条的最大值。第五个函数是回调函数,每次滑动条的滑动都会调用回调函数。回调函数通常都会含有一个默认参数,就是滑动条的位置。在本例中这个函数不用做任何事情,我们只需要 pass 就可以了。

滑动条的另外一个重要应用就是用作转换按钮。默认情况下 OpenCV 本身不带有按钮函数。所以我们使用滑动条来代替。在我们的程序中,我们要创建一个转换按钮,只有当装换按钮指向 ON 时,滑动条的滑动才有用,否则窗口都是黑的。

import cv2
import numpy as np

def nothing(x):
    pass

img = np.zeros((300, 512,3), np.uint8)
cv2.namedWindow('image')

cv2.createTrackbar('R','image',0,255,nothing)
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)

switch = '0 : OFF \n1 : ON'
cv2.createTrackbar(switch, 'image', 1, 1, nothing)

while(1):
    cv2.imshow('image', img)
    k= cv2.waitKey(1) & 0xFF
    if k == 27:
        break

    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    s = cv2.getTrackbarPos(switch, 'image')

    if s == 0:
        img[:] = 0
    else:
        img[:] = [b,g,r]

cv2.destroyAllWindows()

综合以上可以创建一个画板,自选颜色绘图:

import cv2
import numpy as np

drawing = False #  若鼠标按下则为True
mode = True # 如果是True则画矩形,按m切换画曲线
ix, iy = -1, -1

def nothing(x):
    pass

def draw_circle(event, x, y, flags, param):
    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    color = (b, g, r)
    global ix, iy, drawing, mode

    if event == cv2.EVENT_LBUTTONDOWN: # 左键按下返回起始坐标
        drawing = True
        ix, iy = x,y

    # 当鼠标左键按下并移动是绘制图形。 event 可以查看移动, flag 查看是否按下
    elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
        if drawing == True:
            if mode == True:
                # cv2.rectangle(img,(ix, iy), (x, y), (0, 255, 0), -1)
                pass
            else:
                cv2.circle(img, (x,y), 5, color, -1)

    elif event == cv2.EVENT_LBUTTONUP: # 鼠标松开停止绘画
        drawing = False
        if mode == True:
            cv2.rectangle(img, (ix, iy), (x,y), color, 1)
        else:
            cv2.circle(img, (x,y), 5, color,-1)

img = np.zeros((500, 750, 3), np.uint8) #创建画布
img[:] = 255 # 改为白色背景
cv2.namedWindow('image')
cv2.createTrackbar('R','image',0,255,nothing)
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)
cv2.setMouseCallback('image', draw_circle)

while(1):
    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    color = (b, g, r)
    cv2.imshow('image', img)
    k = cv2.waitKey(1) & 0xFF
    if k == ord('m'):
        mode = not mode
    elif k == 27:
        break
    cv2.rectangle(img, (0, 465), (40, 500), color, -1) # 创建一小块区域显示颜色

cv2.destroyAllWindows()

 

你可能感兴趣的:(python)