“这世界有那么多人”
所有代码,复制粘贴即可运行。
希望有能力的朋友还是拿C++运行一下,python对opencv再封装的时候,少了一些C库中的对象和方法。
笔者采用jupyter-notebook,python和opencv视觉处理库实现本专栏的功能
本节讨论对图像、视频的基本使用,以及trackbar的简单使用
1. 图像处理
1.1 打开和销毁图像显示窗口
- 使用可自定义窗口大小
- ord是计算ASCII的函数,读取键盘q值退出
- waitKey(0),等待用户读取按键,非0的时候,表示等待图像显示时长,单位毫秒
- 0xff是C++的习惯,在这里可以不写
import cv2
cv2.namedWindow('window', cv2.WINDOW_NORMAL)
cv2.resizeWindow('window',800,600)
cv2.imshow('window', 0)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
cv2.destroyAllWindows()
1.2 保存和加载图片
- cv2.imread默认读取彩色图像
- cv2.imwrite保存图片至同目录下
- opencv读进来通道顺序是BGR
- 故用opencv的展示方法较为方便
import cv2
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 640, 480)
# 默认读彩图
img = cv2.imread('cat.jpeg')
# numpy 的 ndarray
while True:
cv2.imshow('img', img)
key = cv2.waitKey(0)
if key & 0xff == ord('q'):
break
elif key & 0xff == ord('s'):
cv2.imwrite('cat_cp.png', img)
else:
print(key)
cv2.destroyAllWindows()
2. 视频
2.1 打开摄像头/加载视频
- 打开的是没有音频的视频,速度全靠waitKey的参数设置
import cv2
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)
cap0 = cv2.VideoCapture(0)
# 查看视频,其余以下不变,无声且加速
# cap0 = cv2.VideoCapture('1.mp4')
while cap0.isOpened():
#读一帧数据,返回标记和一帧数据,TRUE表示读到了
ret, frame = cap0.read()
#根据ret做判断,没读到数据,直接退出
if not ret:
break
cv2.imshow('video', frame)
# 假如一个视频是30帧,那么视频间隔可以自己计算
key = cv2.waitKey(10)
if key & 0xff == ord('q'):
break
#释放资源
cap0.release()
cv2.destroyAllWindows()
2.2 录制视频和保存视频
import cv2
cap = cv2.VideoCapture(0)
# *'mp4v'就是解包操作,等同于'm','p','4','v', 在opencv中mp4的完整叫法是mp4v
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# avi的格式压缩视频内存较大
##fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 保存函数对象 输出文件, 多媒体格式文件VideoWriter_fourcc, 帧率, 分辨率
# 主要是这个分辨率
##vw = cv2.VideoWriter('output.avi', fourcc, 20, (640, 480))
vw = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("can not recive frame, Exiting")
break
#写一帧数据(写入缓存)
vw.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'):
break
#释放videoWriter,在release后才会把缓存的数据写到磁盘
cap.release()
vw.release()
cv2.destroyAllWindows()
- JETSON nano可用如下版本:
#!/usr/bin/env python
#coding=UTF-8
import cv2
cap = cv2.VideoCapture(1)
## some videowriter props
sz = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fps = 30
fourcc = cv2.VideoWriter_fourcc(*'mpeg')
## open and set props
out = cv2.VideoWriter()
out.open('output.mp4',fourcc,fps,sz,True)
while(True):
ret,frame=cap.read()
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1)&0xff == ord('q'):
break
out.release()
cap.release()
cv2.destroyAllWindows()
3 鼠标
鼠标在选定的窗口上移动时也可以触发事件响应。
鼠标事件::
- EVENT_MOUSEMOVE 0 鼠标移动
- EVENT_LBUTTONDOWN 1 按下鼠标左键
- EVENT_RBUTTONDOWN 2 按下鼠标右键
- EVENT_MBUTTONDOWN 3 按下鼠标中键
- EVENT_LBUTTONUP 4 左键释放
- EVENT_RBUTTONUP 5 右键释放
- EVENT_MBUTTONUP 6 中键释放
- EVENT_LBUTTONDBLCLK 7 左键双击
- EVENT_RBUTTONDBLCLK 8 右键双击
- EVENT_MBUTTONDBLCLK 9 中键双击
- EVENT_MOUSEWHEEL 10 鼠标滚轮上下滚动
- EVENT_MOUSEHWHEEL 11 鼠标左右滑动
组合事件:
- EVENT_FLAG_LBUTTON 1 按下左键
- EVENT_FLAG_RBUTTON 2 按下右键
- EVENT_FLAG_MBUTTON 4 按下中键
- EVENT_FLAG_CRTLKEY 8 按下CTRL键
- EVENT_FLAG_SHIFTKEY 16 按下SHIFT键
- EVENT_FLAG_ALTKEY 32 按下ALT键
import cv2
import numpy as np
# 五个参数缺一不可
# event 鼠标事件
# x,y为鼠标的坐标
# flags为组合时间 比如shift+左键
# userdata为用户数据
def mouse_callback(event, x, y, flags, userdata):
print(event, x, y, flags, userdata)
if event == 1: #按下左键退出,但是未退出循环
cv2.destroyAllWindows()
cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 360)
#为某窗口绑定鼠标回调事件,里边对应的userdata为123
cv2.setMouseCallback('mouse', mouse_callback, '123')
#生成全黑的图片
img = np.zeros((360, 640), np.uint8)
while True:
cv2.imshow('mouse', img)
key = cv2.waitKey(1)
if key == ord('q'):
break
cv2.destroyAllWindows()
4. Trackbar控件
进度条 可拖动 例子:制作一个调色板
import cv2
import numpy as np
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar', 640, 480)
def callback(value):
#print(value)
pass
#有改变就进入callback函数中一次
cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, callback)
img = np.zeros((480, 640, 3), np.uint8)
while True:
#获取当前trackbar的值
r = cv2.getTrackbarPos('R', 'trackbar')
g = cv2.getTrackbarPos('G', 'trackbar')
b = cv2.getTrackbarPos('B', 'trackbar')
#用获取到的三个值 修改背景图片
img[:] = [b, g, r]
cv2.imshow('trackbar', img)
key = cv2.waitKey(1)
if key & 0xff == ord('q'):
break
cv2.destroyAllWindows()
5. 改进
- 可以将cv_show此类常用函数封装到其他文件中,以后直接调用
- 例如 form utils import cv_show
- 但是必须执行外部文件 %run utils.py
- 如果有indentation错误,是tab和空格缩进混用 用notepad++打开符号显示可以看到
好好努力