先放一张2018绘师100人展的作品,来自初音官方绘师KEI
Hello World讲解
上一话我们写了一个能显示小林自拍照的Hello World示例程序,然后说好的讲解一下。
先贴出代码
前两行是模块的导入,这是python的基础知识。这里引入了两个模块,一个是必须用到的OpenCV的cv2,另一个是做OpenCV开发时常用的numpy(在这段代码中并没有使用numpy,为了养成良好的习惯,小林建议同学们导入这个包)。紧接着在控制台打印“Hello World.”字符串。
然后,敲黑板了,因为要载入小林自拍照了。我们使用一个矩阵(起名叫img)储存Kobayashi.JPG,这里用到了同学们要学的第一个OpenCV函数imread,它用来读取一副图像。函数原型
retvalue:存储图像用的矩阵,可为单通道和多通道。
filename:图片文件名,字符串形式,如果图片和当前的python文件在同一路径下,这个参数可为文件名,反之需为图片文件完整的路径,win下文件路径中默认使用“\”,而代码中则需为“\ \”,原因就是转义字符的存在。
flags:可选参数,用于指明图片以何种色彩空间载入,(关于色彩空间的知识小林会在下一话更新,想提前了解的同学亦可自行查阅相关资料)常用值
下一行用到的函数是imshow,顾名思义,是用来显示图像的。函数原型
winname:窗口名称,字符串形式。
mat:要显示的图像对应的矩阵。由此可以看出,窗口呈现的内容是矩阵,换言之,如果要同时显示多幅图像则需先使用namedWindow函数(劳烦同学们自行查阅API)创建窗口,再对各个窗口使用imshow函数。
然后是waitKey函数,用于等待按键按下或毫秒级延时。函数原型
retval :delay0时,若在delay时间内无按键按下则返回-1,反之返回按键键码。
delay:>0为毫秒级延时时长,
最后是destroyAllWindows函数,也就是关掉所有窗口,以释放资源。函数原型
总体来说,我们常见的python版OpenCV代码主要由三部分组成,即
包和模块的导入
功能部分的实现
结束并释放资源
来自托尔酱的提示:
同学们在查阅API时会发现,文档中使用的模块是cv,而我们使用的模块是cv2,这是为什么呢?其实,cv是OpenCV 1.x版本的模块,属于过去时,cv2是OpenCV 2.x和OpenCV 3.x版本的模块,及现在时和将来时,cv2兼容了cv中的绝大部分内容,托尔也推荐使用cv2。
waitKey函数在使用时要注意,该函数只能在有至少一个窗口时才能使用。64位机器中如需返回键码建议手动补全高八位,即如下写法
我们还能做什么?
当然是打开摄像头做网红啦!
下面小林将讲解如何打开摄像头并在屏幕上显示摄像头画面。
原理讲解:视频其实是由一幅幅画面组成,称为帧。利用人眼的暂留效应,在一定的时间间隔下“放映”每一幅画面即可形成动态效果。我们的摄像头采集视频也是同样的道理,每个采集周期T采集一幅画面并显示出来,周期T的倒数记为f,称之为帧频,单位fps(frames per second)。
在OpenCV中,通常将采集画面和显示画面放在一个循环里,并用waitKey函数控制帧频,即可实现视频的效果。OpenCV支持多源采集视频,即同时允许多个源头(比如双目摄像头或摄像头阵列)采集画面,前提是手动为源头标号以免混淆。
导入模块后,注册一个摄像头
写一个循环,在循环体中读取当前帧并显示出来,循环体的最后加入一个条件判断,用于设定帧频和确定退出循环即结束采集的条件。代码如下
使用笔记本的同学是不是在屏幕中看到了帅帅的自己呢?
用到的新函数read。函数原型
retval:若成功捕获当前帧,则返回True,反之返回False。
这一话的示例代码已经同步到Github上了,Github搜索Kobayashi_OpenCV_py
关注这个神奇的公众号
与小林酱一起出发
领取专属 10元无门槛券
私享最新 技术干货