OpenCV-Python个人总结(一)

OpenCV-Python个人总结(一)

读入图像

使用函数cv2.imread()读入图像:

img = cv2.imread('图像路径',以何种方式读取图片)

第一个参数:读取图像的路径

第二个参数(可忽略,默认读取彩色图):读取彩色图cv2.IMREAD_COLOR(默认值为1),读取灰度图cv2.IMREAD_GRAYSCALE(默认值为0)

opencv不会提醒图像路径是否正确,可以用"print img"输出结果是否为None查看

显示图像

使用函数cv2.imshow()显示图像

cv2.imshow('窗口名字', 图像名字)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.waitKey()是一个键盘绑定函数,时间尺度是毫秒级,看在等待的这段时间里是否有键盘输入,如果值为0,时间将无限期

cv2.destroyAllWindows()删除所有窗口

cv2.destroyWindow()删除指定窗口,参数为窗口名

先创建窗口,在加载图片,使用函数cv2.namedWindow(),第二个参数:cv2.WINDOW_AUTOSIZE为图片不会随窗口调整,cv2.WINDOW_NORMAL图片随窗口调整;下面代码中的窗口名字要一致,否则会出现两个窗口

cv2.namedWindow('窗口名字', cv2.WINDOW_NORMAL)
cv2.imshow('窗口名字',图像名字)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像保存
cv2.imwrite('存放路径',图像名字)

存放路径默认为当前文件夹,路径最好不要含中文,否则会出现一些小问题


调用摄像头

创建VideoCapture 对象,它的参数可以是一个设备索引或者是一个视频文件名。参数为0表示调用笔笔记本内置摄像头,最后释放该对象,函数release()

import cv2
cap = cv2.VideoCapture(0)
while(True):
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame', gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release() # 释放
cv2.destroyAllWindows()

cap.read()第一个返回值ret为布尔类型,表示是否正确读取该帧,第二个返回值frame表示截取到一帧的图片,可用isOpened()函数检查初始化是否成功

cv2.cvtColor表示颜色模型转换,参数1是要转换的图片,参数2是转换模式(cv2.COLOR_BGR2GRAY表示转为灰度图)

cv2.waitKey(1) 与 0xFF(1111 1111)相与是因为cv2.waitKey(1) 的返回值不止8位,但是只有后8位实际有效,为避免产干扰,通过 ‘与’ 操作将其余位置0(这点其实本人也不太理解)

cap.get(propId)可获取视频的一些参数信息,cap.get(3)获取每一帧的宽,get.cap(4)获取每一帧的高;cap.set(propId, value)可修改参数信息

播放视频文件
import cv2
cap = cv2.VideoCapture('视频文件路径')
while(cap.isOpened()):
	ret, frame = cap.read()
	cv2.imshow('frame', frame)
	if cv2.waitKey(25) & 0xFF == ord('q'):
		break
cap.release()
cv2.destroyAllWindows()
保存视频

创建VideoWriter对象,第一个参数为输出路径,第二个参数为FourCC编码(FourCC 就是一个 4 字节码,用来确定视频的编码格式。可用的编码列表 可以从fourcc.org查到),第三个参数为播放频率,第四个参数是帧大小,最后一个参数为是isColor,如果是True为彩色图(默认),False为灰度图(摸鱼怪在尝试用灰度图时,输出的视频编码错误,很神奇不知为啥>﹏<)

import cv2
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('视频存放路径', fourcc, 25, (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(1) & 0xFF == ord('q'):
            break
    else:
        break

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

FourCC的编码格式应依赖于自己的平台

cv2.VideoWriter_fourcc(*‘XVID’)编码为avi格式,记得文件后缀应时".avi",cv2.VideoWriter_fourcc(*‘mp4v’)编码为MP4格式

cv2.flip()函数进行图像翻转,第一个参数为翻转对象,第二个参数:">0"表示水平翻转,"=0"垂直翻转,"<0"水平和垂直翻转


画线
import cv2
import numpy as np
img = np.zeros((512, 512, 3), np.uint8)
img = cv2.line(img, (0, 0), (250, 250), (255, 0, 0), 5)
cv2.imshow('frame', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

np.zeros((512, 512, 3), np.uint8)的作用时建立一个512×512黑色的画布

np.zeros((512, 512, 3), np.uint8)+255则会建立一个白色的画布

cv2.line():第一个参数是需要绘制的图像,第二个是绘制的起始位置,第三个是绘制的末位置,第四个是颜色BGR,第五个thickness是线条粗细(默认值为1,如果给一个闭合图形设置为 -1,那么这个图形就会被填充),其他参数默认

画矩形
cv2.rectangle(img, (100, 100), (300, 300), (255, 0, 0), 5)

该函数第二个参数和第三个参数分别为左上角顶点和右下角顶点,其他同上

画圆
cv2.circle(img, (200, 200), 25, (0, 255, 255), -1)

该函数第二个参数和第三个参数分别为圆形的中心坐标和半径大小,其他同上

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

第二个参数是中心坐标值,第三个参数分别是长轴和短轴,第四个参数是椭圆沿逆时针方向旋转的角度,第五个和第六个参数分别是椭圆弧演顺时针方向起始的角度和结束角度(如果分别为0、360是整个椭圆;如果为0、180则是下半部分椭圆),其他同上

添加文字
font=cv2.FONT_HERSHEY_SIMPLEX # 字体类型
cv2.putText(img,'OpenCV',(100,100), font, 4,(255,255,255),2)

cv2.putText()第二个参数是添加内容,第三个参数是绘制位置,第四个是字体类型,第五个是字体大小,第六个是字体粗细


查询所有被支持的鼠标事件
import cv2
events = [i for i in dir(cv2) if 'EVENT' in i]
print(events)

event鼠标事件

在双击过的地方绘制圆
# coding = utf-8

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 True:
    cv2.imshow('image', img)
    if cv2.waitKey(20) & 0xFF == 27: # 按Esc键退出
        break
cv2.destroyAllWindows()

cv2.setMouseCallback():第一个参数为窗口名字,第二个参数鼠标响应函数,回调函数(函数原型:函数名(event, x, y, flags, param))

鼠标响应函数(回调函数):event是 CV_EVENT_*变量之一,x和y是鼠标指针在图像坐标系的坐标,flags是CV_EVENT_FLAG的组合, param是用户定义的传递到setMouseCallback函数调用的参数


用滑动条做调色板
import cv2
import numpy as np


def nothing(x): # 该函数不做任何事
    pass # 占位语句


img = np.zeros((512, 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' # 创建一个转换按钮(只有当该按钮指向ON时才能调色,否则窗口一直为黑色)
cv2.createTrackbar(switch, 'image', 0, 1, nothing)

while True:
    cv2.imshow('image', img)
    k = cv2.waitKey(1) & 0xFF
    if k == 27: # 按ESC键退出
        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()

cv2.createTrackbar():第一个参数时滑条名称,第二个参数时窗口名称,第三个参数为滑条默认位值,第四个参数为滑条最大值,第五个参数为回调函数(每次拖动滑条都会执行)

cv2.getTrackbarPos():第一个参数为滑条名称,第二个参数为窗口名称。返回值为当前滑条的取值

猜你喜欢

转载自blog.csdn.net/xwmrqqq/article/details/105630555