# opencv名字叫做opencv 但是导包的时候cv2
import cv2
import matplotlib.pyplot as plt
import numpy as np
"""
https://www.bilibili.com/video/BV12Z4y1z7jb?spm_id_from=333.337.search-card.all.click
【不要再看那些过时的OpenCV老教程了】2022巨献,OpenCV零基础小白最新版全套
33h19m46s
"""
# 01 创建和显示窗口
def display_window():
cv2.namedWindow(winname="window",)
# namedWindow(winname[, flags]) []代表可选参数 该函数创建一个可以放置图片或者可拖动控件的窗口,winname表示创建窗口的名字
# WINDOW_NORMAL or WINDOW_AUTOSIZE:前者可以resize窗口大小;后者根据待显示图像大小自动调整窗口大小
# WINDOW_FREERATIO or WINDOW_KEEPRATIO:ratio比例 是否保持图像长宽比
# WINDOW_GUI_NORMAL or WINDOW_GUI_EXPANDED:前者时是绘制窗口的旧方法,没有状态栏和工具栏,而WINDOW_GUI_EXPANDED是一个新的增强的GUI。
# 默认flags参数 == WINDOW_AUTOSIZE | WINDOW_KEEPRATIO | WINDOW_GUI_EXPANDED
cv2.imshow('window', 0)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'): # ord是python中计算ascii值的函数 oxFF要不要都可以
print('准备销毁窗口')
# cv2.destroyWindow('window') 两种销毁窗口的方式
cv2.destroyAllWindows()
display_window()
opencv 显示图片 读取图片的颜色通道是按照蓝绿红(BGR)
所以一般opencv读出来的图片不要用别的方式去展示 比如matplotlib
matplotlib显示 注意要加plt.show()函数
# 02 读取和显示图像
def display_picture():
# opencv 显示图片 读取图片的颜色通道是按照蓝绿红(BGR)
# 所以一般opencv读出来的图片不要用别的方式去展示 比如matplotlib
img1 = cv2.imread('picture.png')
cv2.imshow('test', img1)
key = cv2.waitKey(0) # @param delay Delay in milliseconds. 0 is the special value that means "forever". 0永远不关闭
if key & 0xFF == ord('q'):
cv2.destroyAllWindows()
# # matplotlib显示 注意要加plt.show()函数
# img2 = plt.imread('picture.png')
#
# # 对比一下两张显示方式
# plt.subplot(1, 2, 1)
# plt.imshow(img1)
# plt.subplot(1, 2, 2)
# plt.imshow(img2)
# plt.show()
display_picture()
测试一下颜色通道不一致时的图像区别:
运行注释掉上边的plt绘图函数后有以下结果:
原图在这:
cv2.imwrite(filename, img, params=None) 保存图片函数
# 03 保存图片
def save_picture():
# 创建窗口
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 640, 480)
# 读取图片
img = cv2.imread('picture.png')
while True:
cv2.imshow('img', img)
key = cv2.waitKey(0)
# 按下q退出循环,按下s保存图片
if key == ord('q'):
break
elif key == ord('s'):
cv2.imwrite('123.jpeg', img)
else:
print(key)
cv2.destroyAllWindows()
save_picture()
cv2.VideoCapture(‘video.mp4’)
cv2.waitKey(1000 // 30) 读到的图片显示的时间 越小切换到下一帧的时间越短 相当于视频快进
想和原视频播放一致的话,需要计算延时时间 需要知道原先视频的帧数
# 04 显示视频
def display_video():
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 640, 480)
# 读取视频文件
cap = cv2.VideoCapture('video.mp4')
# 打开摄像头 数字代表不同的设备 比如0 1
# cap = cv2.VideoCapture(0)
# 循环读取视频的每一帧
while True:
# 读一帧数据,返回标记和这一帧数据。True表示读到了数据,False表示没读到数据
ret, frame = cap.read() # 读一帧
# 根据ret做个判断
if not ret:
# 没读到数据,直接退出
break
# 显示数据
cv2.imshow('img', frame)
# 加入一个视频是30帧,那么每张图之间要间隔多少毫秒
key = cv2.waitKey(1000 // 30) # 读到的图片显示的时间 越小切换到下一帧的时间越短 相当于视频快进
# 想和原视频播放一致的话,需要计算延时时间 需要知道原先视频的帧数
if key == ord('q'):
break
# 别忘了释放资源
cap.release()
cv2.destroyAllWindows()
display_video()
# 05 视频录制
def record_video():
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 对应mp4格式
# fourcc = cv2.VideoWriter_fourcc(*'XVID') # avi格式 下面保存后缀名要改
# 创建videowriter 30帧,640 480 为分辨率 帧数可调,分辨率不能错
vw = cv2.VideoWriter('output.mp4', fourcc, 30, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 写每一帧数据
vw.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1000 // 30) == ord('q'):
break
# 别忘了release
cap.release()
vw.release()
cv2.destroyAllWindows()
# record_video()
# 06 控制鼠标
def control_mouse():
import numpy
# 函数名可以随便取,但是参数必须是5个
# event表示鼠标事件,x,y是鼠标的坐标 flags鼠标的组合按键 userdata传入的数据
# 想深入了解鼠标事件可以查一下
def mouse_callback(event, x, y, flags, userdata):
print(event, x, y, flags, userdata)
# 按下鼠标右键退出
if event == 2:
cv2.destroyAllWindows()
# 创建窗口
cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 360)
# 设置鼠标的回调函数
cv2.setMouseCallback('mouse', mouse_callback, '123')
# 生成全黑的图片
img = numpy.zeros((360, 360, 3), np.uint8)
while True:
cv2.imshow('mouse', img)
key = cv2.waitKey(1)
if key == ord('q'):
break
cv2.destroyAllWindows()
control_mouse()
事件名 | 鼠标活动 | 代号 |
---|---|---|
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 |
# 07 TrackBar拖动控件的使用
def trackbar():
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar', 640, 480)
# 定义回调函数
def callback(value):
# print(value)
pass
# 创建3个trackbar
cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, callback)
# 创建背景图片
img = np.zeros((360, 360, 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 == ord('q'):
break
cv2.destroyAllWindows()
trackbar()
延时1ms即改变,也就是实时,没事可以玩一下,像画图的调色板一样