文章目录
- opencv入门到进阶
- 一、图像与视频的加载与展示:
- 1、创建和显示窗口 import cv2
- 2、 加载图片
- 3、 保存图片
- 4、 视频采集
- 5、 读取视频文件
- 6、 视频录制
- 7、 鼠标控制
- 8、 TrackBar控件
opencv入门到进阶
一、图像与视频的加载与展示:
1、创建和显示窗口 import cv2
图像入门
● namedWindow(): 创建一个窗口,并给窗口起一个名字
参数:WINDOW_NORMAL:可调整窗口大小WINDOW_AUTOSIZE:不可调整窗口大小cv2.namedWindow('new',cv2.WINDOW_NORMAL)
● resizeWindow(‘name’,‘high’,‘width’):设置对应窗口大小
● imshow():显示窗口,参数:窗口名
● waitKey():窗口展示时间,单位ms ——>用来监听键盘和鼠标事件 0:一直显示监听键盘事件,如果输入q,则退出窗口
示例1
key=cv2.waitKey(0) #监听到的事件返回给key
if(key=='q'):exit()
● destroyAllWindows():销毁窗口,释放系统资源
2、 加载图片
● imread(path,flag):
IMREAD_COLOR=1:加载彩色图像,任何图像的透明度都会被忽略IMREAD_GRAYSCALE=0:以灰度模式加载图片IMREAD_UNCHANGED=-1:加载图像,包括alpha通道
Note:
● 你可以简单地分别传递整数1、0、-1,而不是这三个flag● 如果你使用的是 64 位机器,你需要修改key = cv.waitKey(0)像这样:key = cv.waitKey(0) & 0xFF● 值得注意的是,如果文件的路径中包含有中文就会报错提供以下解决方法[采用了用numpy中的fromfile读取文件](https://blog.csdn.net/zhangycode/article/details/107936120 "采用了用numpy中的fromfile读取文件")
示例2
import cv2cv2.namedWindow('img', cv2.WINDOW_NORMAL)
img = cv2.imread("./img/img_1.jpg", 1)
cv2.imshow('image', img)
key = cv2.waitKey(0)
#改进:因为key实际得到的是输入指令的ascall所以,输入q不会退出
#只需要ord('q'),让他默认为ascall即可#waitKey()返回的是int型,16位
#但是ascall是8位的,因此最严谨的写法为:
#取key的最后8位
if (key & 0xFF== ord('q')):cv2.destroyAllWindow()
3、 保存图片
● imwrite(name,img)
name,要保存的文件名img,是Mat类型
示例3
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
img = cv2.imread("./img/img_1.jpg", 1)
while True:cv2.imshow('image', img)key = cv2.waitKey(0)if (key & 0xFF== ord('q')):breakelif(key & 0xFF== ord('s')):#将图片保存到。。。。cv2.imwrite("./img/img_1_1.jpg",img)else:print("请重新输入")
cv2.destroyAllWindows()
4、 视频采集
视频入门
● VideoCapure():获取视频设备/从视频文件中读取视频帧
● cap.read()
返回两个值:第一个为状态值,读到帧为true,第二个值为视频帧动画片一秒24帧
● cap.release()
示例4
import cv2cv2.namedWindow('video',cv2.WINDOW_NORMAL)#获取视频设备
cap=cv2.VideoCapture(0)while True:#从摄像头读取视频帧#cap.read的两个返回值ret,frame=cap.read()#将视频帧在窗口显示cv2.imshow('video',frame)#等待键盘事件#如果设为0,则停在一帧不动了,设短一点,让他循环key=cv2.waitKey(10)if(key& 0xFF==ord('q')):break#释放资源
cap.release()
cv2.destroyAllWindows()
5、 读取视频文件
与视频采集操作类似,只需要修改VideoCapture()和waitKey()参数即可
示例5
import cv2cv2.namedWindow('video',cv2.WINDOW_NORMAL)#获取视频设备/从视频文件中读取视频帧
cap=cv2.VideoCapture("./Video/video_1.mp4")while True:#从摄像头读取视频帧#cap.read的两个返回值ret,frame=cap.read()#将视频帧在窗口显示cv2.imshow('video',frame)#等待键盘事件#如果设为0,则停在一帧不动了,设短一点,让他循环#视频速度与waitKey参数值有关key=cv2.waitKey(40)if(key& 0xFF==ord('q')):break#释放资源
cap.release()
cv2.destroyAllWindows()
为cv.waitKey()使用合适的时间。如果它太小,视频将非常快,如果太大,视频将很慢 (嗯,这就是如何显示慢动作)。正常情况下,25 毫秒就可以了。
6、 视频录制
● VideoWriter
参数一:输出文件参数二:多媒体文件格式(VideoWriter_fourcc)参数三:帧率参数四:分辨率大小(帧的大小)
● write:编码、写文件
● release
示例6
import cv2# 创建videoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
# 须是摄像头真实分辨率1280*720,如果分辨率不一致不会给你写数据
vw = cv2.VideoWriter('./Video/video_2.mp4', fourcc, 25, (1280, 720))cv2.namedWindow('video', cv2.WINDOW_NORMAL)
# 获取视频设备
cap = cv2.VideoCapture(0)#while True:
#判断摄像头是否为打开状态
while cap.isOpened():# 从摄像头读取视频帧# cap.read的两个返回值ret, frame = cap.read()#采集数据时要判断数据是否获取到了if ret==True:# 将视频帧在窗口显示cv2.imshow('video', frame)# 写数据到多媒体文件vw.write(frame)# 等待键盘事件# 如果设为0,则停在一帧不动了,设短一点,让他循环key = cv2.waitKey(10)if (key & 0xFF == ord('q')):breakelse:print("未获取到数据")break# 释放VideoCapture资源
cap.release()
# 释放VideoWriter资源
vw.release()
# 释放窗口
cv2.destroyAllWindows()
代码优化
● 显示窗口为什么变大了?在将要显示的时候再调用一次resizeWindow('video',640,360)● 使用isOpened()判断摄像头是否已打开● 采集数据时要判断数据是否获取到了
7、 鼠标控制
鼠标作为画笔
OpenCV: High-level GUI
设置鼠标回调函数:
● setMouseCallback(winname,callback,userdata)● callback(event,x,y,flags,uesedata)
鼠标回调函数参数:
● event:鼠标移动、按下左键● x,y:鼠标坐标● flags:鼠标键和组合键
示例7
import cv2
import numpy as npdef mouse_callback(event, x, y, flags, userdata):
print(event, x, y, flags, userdata)# 创建窗口
cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 360)# 设置鼠标回调
cv2.setMouseCallback("mouse", mouse_callback, "123")#随便窗口和背景
img = np.zeros((360, 640, 3), np.uint8)
while True:
cv2.imshow("mouse", img)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
8、 TrackBar控件
作为调色板的跟踪栏
OpenCV: High-level GUI
● createTrackbar
● getTrackbarPos:获得Trackbar当前值
createTrackbar参数:
● trackbarname:控件名,winname:窗口名● value:trackbar当前值● count:最小值为0,最大值为count● callback,userdata
gettrackBarPos参数
● 输入参数:trackbarname● 输入参数:winname● 输出:当前值
示例9
import cv2
import numpy as np# 创建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)def callback():
pass# 创建trackbar
cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, callback)# 设置背景640*480
img = np.zeros((480, 640, 3), np.uint8)while True:
cv2.imshow('trackbar', img)# 获取当前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(10)
if key & 0xFF == ord('q'):
breakcv2.destroyAllWindows()