本文章是个人的自学笔记,有需要的朋友可以一起学习,写的不好的地方请谅解!
目录
opencv的介绍
一.图片&视频的加载与展示
1.图片加载、显示和保存
v2.imread(filename, flags) :读取加载图片
cv2.imshow(winname, mat) : 显示图片
cv2.waitKey(count) : 等待图片的关闭
cv2.imwrite(filename, img) : 保存图片
2.图像显示窗口的创建与销毁
cv2.namedWindow(winname, 属性):创建一个窗口
cv2.resizeWindow(winname, width, height)设置某个窗口大小
cv2.destroyWindow(winname):销毁某个窗口
cv2.destroyAllWindows():销毁所有窗口
设置窗口退出按键
3.利用opencv从摄像头采集视频
cv2.VideoCapture
VideoCapture.release
VideoCapture.release
VideoCapture.read
VideoCapture.isOpened
4.利用opencv从多媒体文件中读取视频帧
5.利用opencv将视频数据录制成多媒体文件
cv2.VideoWriter
cv2.VideoWriter.release
VideoWriter.write
6.opencv设置鼠标回调函数
cv2.setMouseCallback()
7.Opencv中的Trackbar控件及使用
OpenCV 的出现极大地方便 了计算机视觉研究人员的算法验证,得到了众多研究者的喜爱。 经 过 20 年的发展,它已经成为计算机视觉领域最重要的研究工具之一
OpenCV的目标之一是提供一个简单易用的计算机视觉基础库,帮助人们快速构建复杂的视觉应用程序。 OpenCV库包含超过500个涵盖视觉领域的功能,包括产品检测,医疗成像,安全性,用户界面,摄像机校准,立体视觉和机器人。
那么今天我们就来学习以下opencv的基础
import cv2
# 读取图片,第二个参数为False时,显示为灰度图像,True为原图
img = cv2.imread('c:\\people.jpg', flags=False)
# 显示图片,第一个参数为图片的标题, 第二个参数为你要展示的图片
cv2.imshow('image title', mat=img)
# 等待图片的关闭,不写这句图片会一闪而过,可以设置参数,为多少毫秒自动关闭
#例:cv2.waitKey(1000)为一秒后关闭,不写默认为零
cv2.waitKey(0)
# 保存图片,将灰度图片保存为
cv2.imwrite('c:\\Grey_img.jpg', img)
winname作为窗口的唯一标识,如果想使用指定窗口显示目标图像,需要让cv2.imshow(winname)中的winname与窗口的winname需要保持一致。
窗口创建时可以添加的属性:
cv2.WINDOW_NORMAL:窗口大小可以改变(同cv2.WINDOW_GUI_NORMAL)
cv2.WINDOW_AUTOSIZE:窗口大小不能改变
cv2.WINDOW_FREERATIO:窗口大小自适应比例
cv2.WINDOW_KEEPRATIO:窗口大小保持比例
cv2.WINDOW_GUI_EXPANDED:显示色彩变成暗色
cv2.WINDOW_FULLSCREEN:全屏显示cv2.WINDOW_OPENGL:支持OpenGL的窗口
#设置窗口退出按键
#如果不设置的话,当按下任意键时窗口都会关闭
#设计思路,让其死循环,直到输入'q'
import cv2
cv2.namedWindow('img', cv2.WINDOW_NORMAL) #创建一个窗口
cv2.resizeWindow('img', 640, 480) #设置窗口大小
img = cv2.imread('C:\\picture\\20170701031428774.jpg') #读取图片
while True: #键盘只有输入'q'时退出
cv2.imshow('img', img) #显示图片
key = cv2.waitKey() #等待
if (key & 0xFF == ord('q')):
print('qqqq')
break
elif (key & 0xFF == ord('s')):
print('ssss')
cv2.destroyAllWindows() #销毁所有窗口
原型:VideoCapture(*args,**kwargs)
作用:初始化VideoCapture类并利用构造函数读入该视频的当前帧。
参数:一般仅填入一个,即文件名。如果填入整数,则打开对应的捕获设备ID。若为0,则打开默认摄像头。
参数:无
作用:关闭文件/摄像头
参数:无
作用:关闭文件/摄像头
参数:无
返回值:bool,numpy.array
作用:读取该文件/摄像头的下一帧,成功与否由bool返回值决定,返回的帧矩阵为第二个参数
参数:无
作用:判断设备/文件是否读取成功,若成功,返回True
# 利用opencv将视频数据录制成多媒体文件
import cv2
# 创建videoWriter为写多媒体文件
# 创建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)
cap = cv2.VideoCapture(0)
# 获取摄像头帧宽度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
# 获取摄像头帧高度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 视频编码格式
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
print(width)
print(height)
# 第四个参数一定要与自己摄像头采集的分辨率一致
vw = cv2.VideoWriter('c:\\picture\\out.mp4', fourcc, 20, (width, height))
while cap.isOpened():
# 将视频帧在窗口中显示
ret, frame = cap.read()
cv2.imshow('video', frame)
# 防止视频框变大,再设置一次窗口大小
cv2.resizeWindow('video', 640, 480)
# 写数据到多媒体文件
vw.write(frame)
# 等待键盘事件如果'q'退出
key = cv2.waitKey(40)
if (key & 0xFF == ord('q')):
break
# 释放Videocapture
cap.release()
# 释放videoWrite
vw.release()
# 销毁所有窗口
cv2.destroyAllWindows()
演示就不演示了,长得不帅,大家可以自己试一下,前提自己的设备有摄像头.
# 利用opencv从多媒体文件中读取视频帧
import cv2
cv2.namedWindow('video', cv2.WINDOW_NORMAL) #创建窗口
cv2.resizeWindow('video', 640, 480)
# 从视频文件中读取视频帧
cap = cv2.VideoCapture('C:\\picture\\ikun.mp4')
while True:
ret, frame = cap.read()
cv2.imshow('video', frame) #将视频帧在窗口中显示
key = cv2.waitKey(40) #等待键盘事件如果'q'退出
if (key & 0xFF == ord('q')):
break
cap.release() #释放Videocapture
cv2.destroyAllWindows()
原型:cv2.VideoWriter(*args,**kwargs)
参数:第一个,写入的视频文件名。第二个,由cv2.VideoWriter_fourcc返回的视频制式特定代码,通常有XVID,MPEG等。第三个,该视频的fps。第四个,一个tuple,为该视频的宽、高。
参数:无
作用:释放videoWriter
原型:VideoCapture.write(image)
作用:将当前帧内容写入视频文件
参数:image,写入的当前帧
# 利用opencv将视频数据录制成多媒体文件
import cv2
# 创建videoWriter为写多媒体文件
# 创建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)
cap = cv2.VideoCapture(0)
# 获取摄像头帧宽度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
# 获取摄像头帧高度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 视频编码格式
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
print(width)
print(height)
# 第四个参数一定要与自己摄像头采集的分辨率一致
vw = cv2.VideoWriter('c:\\picture\\out.mp4', fourcc, 20, (width, height))
# 判断摄像头是否为打开状态
while cap.isOpened():
# 将视频帧在窗口中显示
ret, frame = cap.read()
# 采集数据判断是否获取到了
if (ret == True):
cv2.imshow('video', frame)
# 防止视频框变大,再设置一次窗口大小
cv2.resizeWindow('video', 640, 480)
# 写数据到多媒体文件
vw.write(frame)
# 等待键盘事件如果'q'退出
key = cv2.waitKey(40)
if (key & 0xFF == ord('q')):
break
else:
break
# 释放Videocapture
cap.release()
# 释放videoWrite
vw.release()
# 销毁所有窗口
cv2.destroyAllWindows()
(这里后面还会用到用鼠标画彩色矩形,可以先了解)
void SetMouseCallback(const string & winname,MouseCallback onMouse,void* userdata=0)
其中函数指针原型:
void Foo(int event ,int x ,int y ,int flags ,void * param)
event 是鼠标响应类型,CV_EVENT_*变量之一:
EVENT_MOUSEMOVE滑动
EVENT_LBUTTONDOWN 左击
EVENT_RBUTTONDOWN 右击
EVENT_MBUTTONDOWN中键点击
EVENT_LBUTTONUP 左键放开
EVENT_RBUTTONUP 右键放开
EVENT_LBUTTONDBLCLK左键双击
EVENT_RBUTTONDBLCLK 右键双击
EVENT_MBUTTONDBLCLK 中键双击
x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系)。
flags是CV_EVENT_FLAG的组合,flag的状态有:
EVENT_FLAG_LBUTTON 左键拖拽
EVENT_FLAG_RBUTTON 右键拖拽
EVENT_FLAG_MBUTTON 中键拖拽
EVENT_FLAG_CTRLKEY 按住Ctrl不放
EVENT_FLAG_SHIFTKEY 按住Shift不放
EVENT_FLAG_ALTKEY 按住Alt不放
param是用户定义的传递到setMouseCallback函数调用的参数。
import cv2
import numpy as np
def mouse_callback(event, x, y, flags, userdata):
print(event, x, y, flags, userdata)
# mouse_callback(1, 100, 100, 16, "666")
# 创建窗口
cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 480)
# 设置窗口回调
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()
在这里我就不讲解Trackbar控件,这里有篇文章介绍
关于Trackbar的讲解
import cv2
import numpy as np
def callback():
pass
# 创建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar', 640, 480)
# 创建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((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(10)
if (key & 0xFF == ord('q')):
break
# 销毁所有窗口
cv2.destroyAllWindows()
这里是一个简单的调色板
参考博客:
https://blog.csdn.net/Vici__/article/details/100714822
学习视频: