这次的目标是做出一个通过摄像头检测手指滑动,从而可以调整系统全局音量的程序
接着上一篇继续讲
功能实现
1.OpenCV的视频处理
0表示使用系统默认的摄像头
使用一个用久成立的循环,使视频中的每一帧(视频本质上多个静止的画面连续播放,利用人脑的视觉停留,制造出动态的效果)都会一直被读取进来
read 函数有两个返回值,第一个 ret 表示摄像头的状态,成功开启就是 1 否则是 0 , frame 就是画面图片
接下来,需要将颜色通道转换一下,因为OpenCV 里面默认的颜色通道是bgr ,而后续处理的时候,需要的是 rgb 的颜色通道
55 行就是利用机器学习库对图像进行处理了
2.画出并显示手指关节关键点
95 行和 96 行,使用 media pipe 自带的库函数,分别画出左右手的关节关键点,最后用 OpenCV 中 imshow 函数将这个图像显示出来
3.计算手指间的距离
首先需要获取其中一个关节节点的三维空间坐标,在说这个之前,我应该先把传入函数的参数先列出来,没错,就是下面这一行
这里的这个三维空间的坐标,从输出的结果上来看,有点像一个字典,x y z 分别对应上一个值,形成键值对,但是用 type 函数进行检验的时候发现却不是这么回事,出来的结果是一个名字很长的类型,查阅官方文档之后才发现,需要使用像上图函数中的调用方式来进行调用,这个调用方式有点像类成员进行调用,这也可以同时验证了,这个用来存储 x y z 坐标的这个东西是对象的一种
那么,该选择哪两个点的坐标呢?只要能明显地计算出在手指张开和闭合时的相对距离就行,我选择的是大拇指和食指的最远端,也就是 8 号 和 4 号位,各个手指关节位点的索引(上图函数中,中括号内使用的名字与关节位点的对应如下图,这个是官方网站里面的图)
现在,坐标已经获取了,该怎么进行计算呢?
这就是高中数学知识了,计算两个点的坐标,在高中数学中常见的是平面中的计算,也就是 sqrt ( ( x1 - x2 ) ^ 2 + ( y1 - y2 ) ^ 2 ) ,网上可以找得到公式,现在是三维空间坐标,只需要在 y 后面加入 ( z1 - z2 ) ^ 2 即可
4.系统音量的控制
具体的实现,请参考这里:
https://www.zhihu.com/question/50565812/answer/2254577839
这里面有完整的程序
5. media pipe 的开头那几行
在官方文档里面都能找得到