粉丝2.7万获赞3.3万

欢迎大家学习有 buff 的 open cv 小白入门速成系列视频教程学习本教程需要拍成三的基本语言基础, 如果没有拍摄语言基础的话,请先看巴夫老师的拍摄零基础入门系列教程,在上手进行 ok cv 练习前,需要先安装配置好开发环境。在本教程中,操作系统使用温时 拍摄版本,选择三点八及以上开发工具使用拍恰姆社区版, oppo c v 使用当前的最新版本四点五点五作为演示环境。接下来教大家如何安装 opin c v。 在拍恰姆底部的选项中点击终端,英文叫太密脑,在光标闪烁处输入 p i p install open cv gun pattern, 按回车就会自动开始安装,有时候会报错就多执行 几遍,如果还是不行就换成国内的原机型安装。安装完成后还是在终端里出入 pip 内斯特安,回车后如果显示了纳木派和 open cv 干 pass 这两个库,就说明安装完成了。恭喜你能够完成了最艰巨的一步,下个视频我们就开始携带吗?

虽然安装 open cv 包的时候名字叫 open cv 干拍神,但在导入包的时候是写 input cvr。 为什么叫 c v r 呢?这里面的 r 并不表示 open c v 的版本号, open c v 是基于 c 或 c 加加的, c v 表示底层用的是 c 的 a p i c v r 表示使用的是 c 加加的 a p i。 这主要是一个历史遗留问题,是为了保持先后的兼容性,但为了方便,一般会这么写, 给他取一个别名,这样在打字的时候就可以少敲一个数字,不仅可以保护手指,还能提高效率。通过这行代码 就可以打印出 open cv 的版本号。恭喜你成功实现了 open cv 的第一次调用。刚才巴普老 是有剪刀, c v r 用的是 c 加加的 a p i, 它使用 nampad 来存储和处理图线,所以在安装 open cv 干拍层的时候,自动安装上的依赖库 nampad。 这时我们可以直接导入那么派的包,并打印出他的版本号。 南派又是什么东西?南派是派森专门处理高位数组的包,他用来存储和处理大型矩阵,比派森自身欠套列表结构要高效的多。另外针对数组运算提供大量的数学函数,苦真的又快又好用。


接下来我们来尝试实现一下,自动找出两张图片的不同之处啊,比如说我这里准备了两张图, test 一和 test 二,这两张图他们是有不同之处的,但是你如果自己去找的话,可能要找一段时间, 那这个功能怎么实现呢啊?其实也比较简单,假设这两张图不是图,是两个数字的话, 两个数字之间的差异程度是不是靠减法再加一个绝对值来表示的,对不对?那两张图他们之间的差异怎么表示呢?那也是一样的啊,所以我们有一个函数, c v 二点 a b s d, 那这个函数可以算出两张图之间的一个差异,所以呢,我们把这两张图扔进来, 进来之后啊,他就会把这个差异的结果返回给我们啊,比如说就叫 d, 然后这个地图呢,他也是一张图,那这张图有多大呢?那其实就是这两张图的大小,而且我可以告诉大家,这两张图的大小是一模一样的,不信我可以打印出来看一下。 shape, 然后呢, test 二 in shape 走,你看一样的吧,那既然是一样的,那么 deep 它的形状也是这个好,然后呢,我们来把这个 deep 显示一下啊, deep, deep 走, 那这就是结果。我相信现在你应该是知道 a b s 地府是什么 意思了吧,其实就是两张图逐像素的去相减,然后取个绝对值,因为如果两个像素值他是一样的,那么他相减肯定是零啊, 那既然是零,那肯定是黑色的,那如果是不同的两个像素值,那他剪完之后肯定是有差异的,所以呢,像这个地方啊,就是两张图不同的地方, 那我们看一下这个图里面有几处不同,一二三四五五个,对不对啊?所以这样一个差异图就算出来了。那有了这个差异图之后,我们接下来干嘛?我们是不是要尝试把这一二三四五五个不同的地方给框出来? 那怎么快?是不是跟之前所讲的那个验证码的那个套流程是一样的?所以呢,接下来我们要尝试把这张图 变成灰度图,那怎么搞呢?那不就是 c v 二点 cover to color, 然后把地幅图传进来,传进来之后啊,就是 color 必将 to great, 对不对?那这样就能拿到一张灰度图,那么可以把这个灰度图显示一下, 应该会读图吧?好,有了绘图图之后应该干嘛?是不是预值化?那所以呢, c b 二点 stress hold, 那把灰度图扔进去,然后呢?我们这个玉值就懒得调了,就用大金法吧,所以这个玉值我随便填一个,比如说七十,然后二五五,然后 cb 二点 stress otsu 大金法,然后还记得这样一个函数的反馈数据有几个吗?是两个对不对?第一个是预值,那这个预值对于我们来说是没什么用的,所以我不要,然后就是结果,对吧?别造成。 然后呢,我们来显示一下这个 result, 走,哎,好像不行啊,是不是只找出来了两个不同地方,其他三个地方啊,都不行,是不是? 那么这个大金法就没用了?那么我们还是得自己去调下这个玉值啊。玉值的话,比如说我调一个二十, 你看出来了吧?但是呢,可以看到有些白色的点点, 对不对?那现在你看到这个白色的点点可能会想到,哦,我可能要先用这个腐蚀把这个黑色部分扩张一下,消除这些白色的点点,然后呢,我再用这个膨胀把这些白色的部分再扩充一下。 那其实啊,我们可以这个样子啊,还有种方式啊,这些点点出现的原因呢,也有可能是高斯噪声造成的,所以呢,我们可以先对这两张图进行高斯滤波,试一下啊, c v 二点,让他模糊一下啊。 嗯, test image, 然后呢,接下来应该是,嗯,一个 k size 啊三,然后呢,来个零,嗯,这里就 是 test 一米 mat, 然后复制过来,一改成二。 好,然后呢,再试一下,有没有看到是有效果的吧, 你要达到某种目的的话,其实方式有很多的。好,那这里还有一些点点,是吧,那我们可以尝试一下,把这个 k size, 也就是那个绿波核搞大一点,让他的模糊效果更好一点。然后呢,运行, 你看,基本上啊,那些小的杂点点已经没了吧,对不对?也就剩这这一小坨了,那这个小坨其实无声大雅了,是不是?好,那像这一坨,这白色的好像还是得再扩充一下是不是?所以呢,我们 可以尝试给他做一个膨胀啊,膨胀的话掉了一下对不对?那里面就把这个玉子化后的结果扔进来,然后还有一个盒吧,盒的话我这里直接搞啊, 比如说搞个三行三列的盒,全是一,然后呢,这个是日照,好,试一下。 哎,大家可以看到连的还行是不是?但是中间还是有镂空什么的,嗯,我们可以把它搞大点,效果更强。 好,那基本上啊,这五个不同之处就在这了,对不对?那接下来我们是不是可以对它进行一个轮 括检测了呀?是吧?啊?轮廓检测怎么搞的,还记得吗?是不是用那个函数啊? c b 二点放的什么呢?这个吧, 从哪个图里面找?是不是从这个藏式里面找?嗯,然后呢?就是那个什么阿姨吹,对不对?这个然后呢? mazer 的,嗯,那个吹,哎,是哪个来着?吹 啊?这个 simple, 然后这个函数也是一样的,返回两个值,但是只有第一个值对于我们来说是比较有意义的,那就是那个轮廓的数据, 嗯,第二个可以不要,有了轮廓之后啊,我们是可以 算面积了,对不对?或者啊,我们先看一下这里面到底有几个轮廓啊?嗯,论,然后看,这是 走有六个,一二三四五六啊,估计就是这六个,那我们要的那个轮廓肯定是最大的五个吧,是不是?那我们一样啊,是算一下那个面积,那个面积怎么算?是不是搞一个列表啊, 对不对?然后呢?去便利我们的轮廓吧。呃,印,然后这个,然后这个里面呢?我们把算出来的面积扔进去,怎么算?是不是 c v 二点 面积,这个对吧?把 c e 扔进去。好,那这个时候答一下啊, 面积应该是有了,喏,这么几个吧。然后呢,我们是不是要找里面最大的五个,所以要排序吧,对不对?排序的话是不是 n p 点 alt, 然后把这些 eris 扔进来,扔进来之后,然后就会有一个 index, 对不对?我看一下这个 index 是不是对的? 四三零二五幺,应该是吧。好,那有了这个锁引之后,我们要拿最大的五个,我们是不是一样切片,对吧?所以这里呢,呃,从倒数第五开始 对不对?好,然后有了 index 之后呢,我们就可以去拿对应的轮廓了,是吧?也叫 top 五 ctrl 四啊,对,这个啊,我们循环啊, 音润指循环五次,然后呢 top 五里面去放东西,放什么东西?放他, 对吧?然后呢 index, 哎,是不是?那这个时候啊,我们这个 top 五里面就有最大的五个轮廓, 那有了这些轮廓之后我们就可以去干嘛?是不是去把这个框给画出来啊?画框之前我们还是要算下他的包围盒吧,那么我们这个样子 c in top 这个,然后呢 c v 二点绑定 rect, 把这个 c 给扔进来,那这个就是它的包围盒,也就是包围框 x y w h。 有了这个玩意之后啊,我们就可以画东西了,是不是 c b 二点 rectangle 跟之前的是一样的,然后在哪个图上画呢 啊?我们在哪个图上画?因为这个绿造成已经是黑白的图了,是个当空道图,所以我们不如直接在这个上面画吧。啊,在 test 一上面画 啊,画什么呢?画框啊,那就是 x y, 然后 x 加 w, 再来一个 y h, 然后以什么颜色来画,比如说用红色,那就零零二五五,然后那个线的粗细,比如三好,然后呢我们显示的话还是显示这个吧, 写这个吧,好走嘿,大家可以看到,是不是看出来了啊,我仔细看一下啊,这个窗帘,这里啊确实是不一样,然后这里这个墙上有个画框,确实是 啊,然后呢,这个枕头的颜色不一样,然后下面这里啊,这里是没有的,对不对? 然后呢,还有就是这一片呢,这个床单的跟花纹不一样啊,没错,那这样一个流程就做完了,那我们其实可以尝试把这样一个流程 分装成一个函数,是不是?好,我们来分装一下啊,啊?这么一个流程里面的输入是什么?是不是就是这两张图啊?所以呢,我们可以写个函数啊,比方啊,比如说就叫 detect 吧,啊,检测,然后呢要传两个途径呢,那比如说就加 银麦子一啊,一个叫银麦子二,这个银麦子一就相当于这个,然后银麦子二呢?相当于这个啊,那这个肯定是不要了,对不对? 那接下来把这些东西给缩进来,那这个是他,他,然后这个是他硬了,其实可以不要了,嗯,然后这个是他, 这个是他,然后走走走,走走走走,到下面走走走。那我们整个这样一个功能啊,其实这个画框啊,应该是在调用这个函数的外面去画的啊,所以我们应该是到这就打纸了, 那我们应该怎么把这个数据给返回出去呢?我们是不是应该返回五个方框它的坐标啊,对吧?呃,五个方框的坐标啊,所以我们可以再搞一个变量啊,比如说就叫 rector positions, 可以吧?是个列表。 然后呢,我们就干嘛呢?把这个东西 来个 apen 啊,把这个坐标扔进来,扔进来之后呢,完了之后呢,我们 就再返回我们的 rectopos 就可以了,是不是?呃,基本上就是这样子吧。然后呢,我们来尝试调用一下这个函数,呃,调用这个函数的话简单啊,先读两个图嘛。呃, c v 二点 m re 的 test, 一点 jp 机,然后 c v 二点 ever read test 二点 jp 机,那这里叫,比如说就叫 ms 一, image 二,然后呢,我们就把这两个图给扔进来, image, image, image 二,然后接下来我们就会拿到这个五个轮廓对应的那个包围框,啊,是吧?比如说这个 rex, 好,然后我们来打印一下,看看能不能拿到东西运行,你看有了吧?啊?有了这些东西之后,我们是不是在这边可以去画?那我要画的话就简单了,我就变一下这个列表就可以了。 four rect in rex 四,对不对?好, 那这个东西因为它可以自动解包嘛,我这里搞个 s, y, w, h 也是可以的。然后呢,接下来就是之前的代码啊, c v 二点 rectangle, 是吧? rectangle, 呃, rectangle 再画到哪?画到英文的衣裳码? 嗯,刚刚 image 一,我这里画 image 二吧,然后呢就是 x, y, 然后呢, x 加 w, y 加 h, 然后再来一个零零二五五,红色的,然后线是三的一个粗细啊,完了之后,然后我们在 cpr, 我们搜一下啊, 嗯, image 一,这个是 image 一,然后呢 image 二, image 二,然后 c 于二 d with p 零,好,试一下走, 可以看到是不是出来了吧,这就是大家来找查这个脚本的最核心的逻辑。

四点一,识别怪物副本中的怪物有很多种,而且还分左右方向,我们需要对每种怪物都进行截图, 这样就有很多需要查找的图片。这种情况下我们手工的去指定图片列表比较麻烦,因此我们采用自动生成图片列表的方法, 为怪物图片专门建立一个文件夹,将怪物的截图都放在里面,并通过读取目录中所有的图片自动生成图片列表。这里我们要用到拍成自带 os 酷的一个功能,就是列出指定目录下所有的文件,我们来体验一下。 第一步,先准备一个怪物的文件夹,专门用来存放怪物的图片,我们在拍叉的橡木名顶层里面点击另一个 个文件夹,取名叫怪物。当然你可以直接进入到这个元代码的目录里面,新建一个怪物的文件夹,也可以这里新建,那我这里新建完了以后,这里就有个怪物的文件夹。第二步就是要准备一下怪物的图片,我这里之前游戏的截图, 然后用这个截图来举个例子,我们来截取一下怪物的图片。截取怪物图片的时候,我们尽量去截取这个怪物身上不会动的地方,比如说这个怪物 他拿到的手和他的眼睛他都会动,那么他的头带是不会动的,我们就以他的头带截取他头带,我们来这样截取一下,我们这样截取一下他的头带就可以了,我们保存一下, 我们保存到我们的那个目录里面去,我们取个名字就叫怪物一 截。取了这张图片以后,我们还要对图片做一个镜像,因为他现在的怪物是朝右边的,要是怪物朝左的话,他的图像就不是这个了。我们编辑一下图片, 然后直接选择这里旋转,水平旋转,然后直接在另存为,另存为 pnt 格式表保持一致,我们叫怪物一二,我们的后面加个二字, 确定这个就可以了,这时候我们就有两张对称的图片了,那像这个难难分数,这个我们也可以看到这个,这个怪和这个怪他也有不一样,他的眼睛一个是真的,一个是 b 的, 然后他一个嘴巴一个张的也是闭的,但他有没有一样的地方呢?我们发现他还是有一样的地方的,就是他那个腹部的一个花纹,我们对这个腹部的花纹截图就可以了,我们截这一块就可以了, 你看我们家怪物爸爸,然后同样的也是把这个腹部的花纹做一个编辑,然后镜像一下,然后另重 我们家怪物二二。好,这个就是我们截图的一个文件,这里我提前截好了其他的图片,用同样的方法操作即可,我这里在这里直接就替换掉好截图文件准备好以后,我们来测试 一下拍摄库自带的 o s 的一个功能,然后复制代码,在这个获取坐标这里直接在最后一行 复制一下这个提示, o s 标红的,我们引入一下 i m p o r t o s 就可以了。我们没有打印,还要打印一下, 我们可以看到这里有个列表,就是怪物的图片列表,这样我们就避免了像我们这个判断场景一样,我们手工的去指定一个列表,当然这个场景列表也可以用这样的方法来实现这个场景列表的一个自动生成, 这个体验完了以后,我们这个代码就可以删除了,因为这个只是我们看一下这个代码的功能,下一步就是获取怪物坐标,复制代码粘贴到这下面 我们来解释一下这个代码。第一个就是获取怪物坐标,我们取的名字就叫虎。获取怪物坐标,然后定义了一个怪物坐标的一个数组,因为怪物肯定会有很多个,所以我们就要把它所有的坐标放在一个数组里面, 然后一样的我们把这个怪物目录的文件夹的目录全部提取出来,做成一个列表,然后循环这个列表,把列表中的每一张图片都进行对比一下,那就是 sirilood i am ready 去读取怪物中的什么呢?就是 小图片名称,就是把每一张小图片名称我都一个个拿出来对比,对比完成了以后,然后就筛选结果,筛选结果以后,如果我们找到了怪物这张图片的坐标,我们一个个就把它装装在这个怪物坐标列表里面,就是怪物坐标里面, 因为比如说我们查找这个双刀石像,他肯定会查找了一二三四,查找了四个,他每一样图片都可能会查找到多个坐标,然后把每个坐标都提取出来,然后放到这个怪物坐标里面,然后最后就是返回这个怪物坐标,那这个就是获取怪物坐标, 那对于查找怪物来说,我们只需要在副本内这个场景才进行怪物查找,所以在慢点 p y 这个部分,我们先判断一下场景,当场景为副本内时,我们才获取 怪物坐标,那获取怪物坐标以后,我们使用那个红色的框框把怪物画出来,我们复制一下代码,然后来到 mini py 当中,我们现在这个是判断场景,对吧?我们判断场景完了以后,把这个判断场景 替换掉。我再解释一下这个判断场景以后,我们首先获取场景在哪里?如果场景是在副本里面的话,那什么时候在副副本里面呢?就是在这个截图中查到这个生命值魔法,这个图片就是上节课我们讲的, 那么我们就开始获取怪物坐标,然后获取坐标点,获取怪物坐标,然后把这个解读文件传进去,然后我们打印一下获取的怪物坐标是什么。我们获取到怪物坐标以后,我们就对怪物的坐标进行 画框框,我们怪物有很多个,所以我们要做一个循环,把怪物坐标里面的每一个坐标都提出来,然后画一个框,我们画一个三十乘三十,然后颜色是红色的框就可以了,我们来测试一下。 好,这个现在我们直接运行吧。我们进入,随便进入一个副本里面, 我们可以看到怪物的身上都有一个红色的框框标记他,包括这个猪,这个双刀石像。 当怪物在发动攻击的时候,我们可能探测不到他,但是这个没有关系,我们只要大部分时间能够探测到怪物就可以了。好,我们怪物清掉以后,我们的程序他已经探测不到了,所以 坐标为空。补充一点啊,我们查看这个怪物,结果发现这个怪物的坐标比实际的怪物要多,当我们杀到最后一个怪的时候,我们发现这个坐标会有一个、两个、三个、四个、五个,就是二六三、二二零二六四,二零二六二。你看这坐标都几乎在同一个地方, 其实这个我们后期可以处理,但是实际上他不影响我们打怪或者说识别怪物的位置。嗯,差一两个坐标也无所谓,我们的攻击是有范围的,也不可能说只攻击一两个像素。 好,本节课就讲在这里,如果觉得视频对你有帮助,欢迎一键三连。

在真正教大家如何使用 n、 c、 b 来处理图像之前,我觉得有个事情必须要做,就是向大家解释一下,在计算机眼里一张图到底是什么东西? 比如说可以看到这样一张图里面写了一个黑色的数字五,对不对?那在计算机眼里这张图是怎样的呢?其实他就是把它看成是一个一个的格子所组成的, 那这一个一个的格子就叫做像素,比如说这里十四个像素,就是说我这一张图横着数有十四个格子, 十六个像素的意思就是我竖着数有十六个格子,那这每一个格子或者叫像素里面呢?他其实是存着具体的数值的,那这个数值就叫做像数值。像数值他也有自己的 取值范围,那就是零到二百五十五,如果你的像素值越趋近于零,那么就说明你对应的那个像素就越黑。反之,如果你的像素值越趋近于二百五十五,那么你这个像素就越白。 所以如果我们把像素值全部填进去的话啊,就是这个样子,很简单吧,像这种图里面的像素值只有两种情况的时候,我们就称它为二只图。好,我们继续往下看, 大家可以看到这里有一张灰不拉几的图,那这种灰不拉几的图我们一般都叫他为单通道图,或者叫灰度图。什么叫单通道呢?其实就是我这些像素拼起来,他只能拼出一个长方形来,那既然有单通道,那肯 六多通道,那多通道的话等一下再看,我们先专注于单通道,大家可以看到这一张图,这张图其实就是把我们这张原图放到 ps 啊,或者是那些图片查看器里面,我们把它放大所得到的一张图, 可以看到里面有一个一个的格子,对不对?那这些格子呢,就是所谓的像素了,然后这些像素里面存的那些值就是像素值,所以不管是二指图还是单通道图,他们在计算机眼里其实就是一堆数字所拼成的一个长方形而已。 好,那接下来我们来看一下多通道图,多通道图里面最常见的就是 rgb 三通道图,什么意思呢?比如说这里有一张彩色图片,那这张彩色图片里面的颜色是怎么表示出来的? 其实就是看成是红色加绿色加蓝色这三原色混合而成的,所以呢就叫做 rgb 三通道图 啊。其实这 rgb 三个通道的图为什么会长成这个样子啊?也非常好理解,比如说这个胸部这里是偏黄的,对不对?那么我们知道黄色是由红色加绿色组成的, 是不是?所以呢,你们会看到啊,胸部这一块红色的通道图里面啊,他是更加亮的,然后呢,蓝色通道里面这一块是比较暗的,从这样一个现象可以看得出来,每一个通道所呈现出的明暗啊,说白了就是代表我这样 一个颜色在彩色图里面所占的一个比重。所以不管是单通道图还是多通道图,在计算机眼里啊,就是一对像素值所排列出来的矩阵而已。