1.做一个魔法棒吧
获得了物体的坐标后,可以用它来完成一些有趣的事情,例如把物体当作“笔”在图像上绘制出图样。我们可以选择一种颜色的黏土,将其固定在任意棒状物(例如铅笔)的一端并揉成球形,做一个 DIY 的“魔法棒”
用 OpenCV 绘制小圆点为了让魔法棒实现画图的效果,我们需要学习用 OpenCV 进行图形的绘制。画小圆点可以利用 circle 函数来实现:
圆心坐标和线的颜色必须用小括号括起;颜色按 BGR 的顺序指定,3 个参数依次为蓝色值、绿色值、红色值,范围为 0~255;线宽的参数为 -1 时表示圆被实心填充,绘制圆点时指定这个参数为 -1 即可。代码如下所示。
该语句可以在 frame 图像上以 ( x , y ) 点为圆心绘制一个半径为 2 的黄色实心圆。但此前输出的目标物体中心坐标 x 和 y 都是小数(float 类型),而 circle 函数只能接受整数(int 类型)的圆心坐标值。Python 中,使用 int 函数可以将其他类型的值转为整数。对小数而言,使用该函数转化后将直接舍弃掉小数点后的数据。
结合这一语句,我们可以在图像上检测到的物体中心坐标上打上一个小圆点。通常情况下,为了绘点时看起来更舒适,我们期望能让摄像头像照镜子一样显示镜面的图像,这可以用 flip 函数转换得到,例如:
翻转方式值为 0 表示上下翻转,为任意正数表示左右翻转,为任意负数表示上下左右均翻转。flip 函数将对传入的图像进行翻转并返回翻转后的图像。Python 中的列表与元组现在我们只能让 OpenCV 在每一帧中绘制一个点。要绘制连续的点,需要将过去所有帧中物体的中心坐标记录下来,再将它们在一帧中全部绘制出来。在需要存储一组数据时,我们可以使用 Python 中的列表(list)类型。列表是一种数据类型,它可以存储一系列按顺序排列的数据。这些数据可以是一个数字、一个字符串,或是另一个列表。我们可以用下面的语句给一个列表型变量 list 赋值:list = [1, 2, 3, 4, 5]对列表赋值时须使用中括号 [ ] 括起,并以逗号分隔其中的数据。这个名为 list 的列表按顺序排列了 5 个数字,使用列表名 [ 排列序号 ] 的方式可以调出指定位置的值。排列序号从 0 开始,例如 list[0] 将取出第一个值 1。列表中的每一个值被称为列表中的一个元素。在记录物体坐标的例子中,我们可以先建立一个空的列表:
每刷新一帧找到新的坐标值时,使用 append 函数可以方便地将一个值添加到列表pointlist 的最后一位:
这里用中括号括起的 [x, y] 实际上也是一个列表,它包含 x 和 y 两个值。在此前的程序中,实际上我们曾多次提到过“一组数据”这个概念,它代表了与列表非常类似的元组类型。元组(tuple)是 Python 中另一种由一系列按顺序排列的数据构成的数据类型,它基本上是一个不可修改的列表。例如,元组不能用 append 函数追加一个值,也不能对其中的任何值进行更改。在赋值时,元组需要使用小括号括起,而不是用中括号括起:
在不涉及修改操作时,列表和元组能使用的函数基本是一致的。例如 len 函数可以得到一个列表或元组中元素的数量,也就是它的长度。for 循环遍历结构按照这样的方式,我们可以得到一个存储着过往每一帧物体中心坐标的列表。接下来只需要在这个列表中的每一个坐标上都画上一个小圆点即可。要实现这一操作,可以使用 for 循环遍历结构。与 while 循环类似,for 循环结构也是一个循环型结构,但它主要用于对列表、元组等的元素进行遍历。for 循环结构的写法如下:
我们需要设定一个变量,在每一次循环中依次用列表或元组中的元素对它赋值,再执行循环中的语句。内部的执行语句须进行缩进。for 循环遍历的执行逻辑如图
for 循环遍历的对象也可以不是列表或元组,而是一个字符串或是数值范围。该程序段可以从左至右按顺序打印出字符串中的每一个单个的字符
此段程序则可以从 0 开始以 1 递增,打印到 99 为止。注意这里的 range( 范围起点 ,范围终点 ) 设定了遍历的数值范围,实际遍历的区间包括起点,但不包括终点。回到绘制列表中小圆点的例子中,该程序也可以用 for 循环结构编写
在每次循环中,point 变量存储着列表中的一个元素,即形式为 [x, y] 的坐标列表。用point[0] 和 point[1] 可以分别得到对应的横坐标和纵坐标。按键值与键盘控制利用 OpenCV 的 waitKey 函数可以方便地实现手动开始、暂停或清除图案的功能。此前我们知道,waitKey 函数必须跟在 imshow 之后,表示在显示一帧后等待的时间(单位为毫秒)。事实上,设置 waitKey 函数的主要作用是在等待的时间内获取键盘的按键指令:
这样得到的 k 变量可以获得在这段时间内键盘按下的按键值。在计算机中,每一个键盘按键都可与一个数字值对应,对应的方式称为键盘编码。OpenCV 使用的编码方式

博客介绍了制作魔法棒、认识机械臂并控制其运动使物体y坐标为150,重点阐述了人脸识别方法,包括使用肤色检测和哈尔特征检测来找到人脸,还提及脸颊与眼窝平均灰度值差异。
最低0.47元/天 解锁文章
9万+






