OpenCV基本操作

本文主要介绍图像的读取、操作、转换、显示、保存,视频流的获取、显示和保存,以及如何绑定窗口和事件响应函数。

1 图像的读取、操作、转换、显示、保存

参考

读入图像

使用函数cv2.imread(filepath, intflags)读入一幅图片

  • filepath:要读入图片的完整路径
  • intflags:读入图片的标志
    • cv2.IMREAD_COLOR:1,默认参数,读入一副彩色图片,忽略alpha通道
    • cv2.IMREAD_GRAYSCALE:0,读入灰度图片
    • cv2.IMREAD_UNCHANGED:-1,读入完整图片,包括alpha通道

显示图像

cv2.waitKey(time_of_milliseconds)

  • 等待键盘输入,单位为毫秒,即等待指定的毫秒数看是否有键盘输入,若在等待时间内按下任意键则返回按键的ASCII码,程序继续运行。若没有按下任何键,超时后返回-1。参数为0或负值表示无限等待。不调用waitKey的话,窗口会一闪而逝,看不到显示的图片。
  • 当我们使用imshow函数展示图像时,最后需要在程序中对图像展示窗口进行销毁,否则程序将无法正常终止。

色彩空间转换函数 cv2.cvtColor()

注意

  • imutils这个库主要对cv2做了简单的封装,使函数用起来更加友好。
  • imutils.resize(img,height=xx,width=xxx)修改图像的大小。 这个函数会根据图片的比例进行重新绘制大小,如果你的图片是200:200的图片比例,那么如果你使用resize函数的时候,resize(img,height=50,width=20) 那么最后修改的图像是与最小的那个数字对齐,即width=20,所以最后出来的图片大小是20 * 20,而不是50 * 20,或者50 * 50.
import cv2 
import numpy as np
#cv2并不是基于OpenCV 2.**开发的,而是为了区别于cv,cv2采用了面向对象的编程方式

## 1.1 图像的读取与保存 ##
img1 = cv2.imread("fahai.png", cv2.IMREAD_GRAYSCALE)#读入后格式numpy.ndarray
cv2.imwrite("fahai_g.png", img1)

#创建array类型图像
img2 = np.zeros((3,3), dtype=np.uint8)
img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR)

#查看array属性
print(img2.shape, img2[0, 0].size, img2.dtype, type(img2))
#查看颜色空间转换类型
flag = [i for i in dir(cv2) if i.startswith("COLOR_")]
#print(flag)


## 1.2 图像的显示 ##

img3 = cv2.imread("fahai.jpg")  #默认以BGR格式
img3[-30:, :30] = np.array([0, 0, 255]) #将左下角30像素方块内换成红色

#显示方式1
while(True): #持续循环显示,直至键入q后退出
    cv2.imshow("img3", img3)
    if cv2.waitKey(1) & 0xFF == ord('q'): 
        break
#cv2.destroyWindow(windows_name) #销毁单个特定窗口,若不及时销毁窗口,则出现异常
cv2.destroyAllWindows()  #销毁全部窗口

#显示方式2
cv2.imshow("img3", img3)
if cv2.waitKey(0): #永久性阻塞,直至键入任意键
    cv2.destroyAllWindows()

2 视频流的获取、显示和保存

参考

## 2.1 视频的读取和显示 ##

#创建一个视频读入流对象
cap = cv2.VideoCapture('test.mp4') 
assert(cap.isOpened) #检查是否正确打开视频

#创建一个写入流对象,先获取待读取视频的帧率和尺寸
fps = cap.get(cv2.CAP_PROP_FPS)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('my_video1.avi', 
                              cv2.VideoWriter_fourcc('I','4','2','0'), fps, size)

ret, frame = cap.read() #抽取一帧,read()函数返回第一个参数是bool
while(ret and not cv2.waitKey(50)&0xFF==ord('q')):
    cv2.imshow("frame", frame)
    videoWriter.write(frame) #将这一帧保存下来
    ret, frame = cap.read()
    
cap.release()  #及时释放资源
videoWriter.release()
cv2.destroyAllWindows()


## 2.2 摄像头的视频获取和保存 ##

cap = cv2.VideoCapture(0)
assert(cap.isOpened) 

fps = 30
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('my_video2.avi', 
                              cv2.VideoWriter_fourcc('I','4','2','0'), fps, size)

ret, frame = cap.read()
tick = 10 * fps
while(ret and tick > 0):
    videoWriter.write(frame)
    ret, frame = cap.read()
    tick -= 1
    
cap.release()
videoWriter.release() #若不释放资源,则后面会有一段无效帧
cv2.destroyAllWindows()

3 绑定窗口和事件响应函数

参考

## 事件响应函数示例1 ##
"""
功能:显示一张图片,若双击左键,则画圆;键入'q'则退出。
"""

import cv2

img4=cv2.imread('fahai.jpg') #读取图片作为背景

#定义画圆事件,如果事件双击左键发生
#则以此时双击的点为原点画一个半径为100px BGR为(255,255,0)粗细为3px的圆圈
def draw_circle(event, x, y, flags, param): 
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img4, (x,y), 100, (255,255,0), 3)

# 创建图像与窗口并将窗口与回调函数绑定
cv2.namedWindow('image') 
cv2.setMouseCallback('image', draw_circle)

while(not cv2.waitKey(100) == ord('q')): #等待100毫秒 刷新一次显示图像
    cv2.imshow('image', img4)
        
cv2.destroyAllWindows()


## 事件响应函数示例2 ##
"""
功能:调用摄像头录制视频,当鼠标左击,或者键入某个值,则退出视频流的读取和保存
"""

clicked = False
def onMouse(event, x, y, flags, param): #定义事件函数
    global clicked
    if event == cv2.EVENT_LBUTTONUP:
        clicked = True
        
cv2.namedWindow("myWindow") #创建一个窗口
cv2.setMouseCallback("myWindow", onMouse) #将事件函数与窗口绑定

cap = cv2.VideoCapture(0)
fps = 30
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('myvideo.avi', 
                              cv2.VideoWriter_fourcc('I','4','2','0'), fps, size)

ret, frame = cap.read()
while(ret and not clicked and cv2.waitKey(1)==-1):
    cv2.imshow("myWindow", frame)
    videoWriter.write(frame)
    ret, frame = cap.read()
    
cap.release()
videoWriter.release()
cv2.destroyAllWindows()
原文地址:https://www.cnblogs.com/inchbyinch/p/12444316.html