Python OpenCV入门
    Python OpenCV 入 门  欢 迎 阅 读 系 列 教 程 , *E;EÆOpenCV, 它 是 一 个 0 像 和 视 颜 处 理 库 , 包 含 C + 地 C , Python  和 Java 的 绑 定 。 OpenCV 用 于 各 种 像 和 视 频 分 析 , 如 面 部 识 别 和 测 , 车 牌 克 读 , 照 片 编 辑  , 高 级 机 器 人 视 觉 , 光 学 字 符 识 别 等 等 。  你 将 # 要 两 个 主 要 的 库 , 第 三 个 可 选 : python-OpenCV , Numpy 和 Matplotlib.
    dțd  Ădwnu  1 texsuț dțd  ) łaaLłM  dȚd  ' : AOUad0-uoqĂd  : SMOpu!M
    Linux/Mac  pip3 install numpy  apt-get install python3-numpy  apt-get python3-Pip .  pip3 install matplotlib  apt-get install python3-matp10tlib  apt -get install python-OpenCV  Matp10tlib  Numpy ,  python-opencv , Python OpenCV
    OpenCV 有 一 些 搌作, 如 果 没 有 完 整 安 装 OpenCV ( 大 小 约 3GB ) , 亻 等 无 氵 去 完 成 , 但 是 实 际  上 你 可 以 用 python-OpenCV 最 简 安 我 们 将 在 朩 系 列 的 后 续 部 分 中 使 用 OpenCV 的 完 整 安 装  , 如 果 你 愿 意 的 话 , 你 可 以 随 意 获 得 它 , 但 迷 = 个 模 块 将 使 我 们 忙 一 段 时 间 !  通 过 运 行 Python 并 执 行 下 列 令 来 确 保 亻 小 女 装 成 功  import : 刂 2  import matplotlib  import numpy  如 果 你 没 有 宿 误 , 那 么 你 已 经 准 缶 好 了 。 好 了 嘛 ? 让 我 们 下 潜 吧 !  首 先 , 在 像 和 视 频 分 析 方 面 , 我 们 应 该 了 解 一 些 基 本 的 假 设 和 范 式 。 对 现 在 每 个 摄 像 相 过 《 记  录 方 式 来 说 , 记 录 实 际 上 是 一 帧 一 帧 地 显 示 , 秒 3 60 次 。 但 是 , 它 们 的 核 心 是 静 态 帧 , 就 像  像 一 样 。 因 此 , 图 像 识 别 和 视 频 分 析 大 部 分 使 用 相 同 的 方 法 。 有 些 东 西 , 如 方 向 跟 踪 , 将 要  连 续 的 图 像 ( 帧 ) , 但 像 面 部 检 测 或 物 体 识 别 等 东 西 , 在 图 像 祀 视 频 中 代 码 几 手 完 全 相 同 。  接 下 来 , 大 犀 的 图 像 和 视 颜 分 析 归 结 为 尽 可 能 简 化 来 源 。 这 几 乎 总 是 起 始 于 转 焕 为 灰 度 , 但 也  可 以 是 彩 色 滤 0 》 渐 变 或 这 些 的 组 合 。 从 这 里 , 我 们 可 以 对 来 源 执 行 各 种 分 析 和 转 化 。 一 般 来 说  这 里 发 生 的 事 情 是 转 嵝 完 成 , 然 后 是 分 析 , 然 后 是 任 何 盖 , 我 们 希 望 应 用 在 原 始 来 源 上 , 这  就 是 你 可 以 经 帛 看 到 , 对 象 或 面 部 识 别 酊 成 品 。 在 全 色 图 像 视 频 上 显 示 。 然 而 , 数 据 实 际 上 很 少  以 这 种 原 始 形 式 处 理 。 有 一 些 我 们 可 以 在 基 不 层 面 上 做 些 什 么 的 例 子 。 所 有 这 些 都 使 用 基 丕 的 网  像 头 来 完 成 , 有 什 么 特 别 的 .
    在 边 缘 測 的 情 况 下 , 黑 色 对 应 于 , 0 , 劬 的 像 素 值 , 而 臼 色 线 条 是 ( 255 , 255 , 255 ) 。 濒  中 的 每 个 图 片 和 帧 都 会 像 这 样 分 解 为 像 素 孬 并 且 像 边 缘 检 测 一 样 , 我 们 可 以 准 新 , 边 缘 是 基 于 白  色 与 黑 色 像 素 对 比 的 地 方 。 然 后 , 如 果 我 们 想 看 到 标 记 边 缘 的 原 始 图 像 , 我 们 记 录 下 0 色 像 紊 的  所 有 坐 标 位 置 , 然 后 在 京 始 图 兮 或 视 频 上 标 记 这 些 位 置 。  到 朩 教 程 结 束 时 , 你 将 能 够 完 成 上 述 所 有 撮 作 , 并 且 能 够 训 练 你 的 机 器 识 别 你 想 要 的 任 何 对 象  。 就 像 我 刚 开 始 说 的 , 第 一 步 通 常 是 转 嵝 为 灰 。 在 此 之 前 , 我 们 需 要 加 载 像 。 因 此 , 我 们 来  做 吧 ! 在 整 个 教 程 中 , 我 极 力 鼓 励 你 使 用 你 自 己 的 数 庭 来 元 如 果 你 有 璺 像 头 , 一 定 要 使 用 它 ,  否 则 找 到 你 认 为 很 有 趣 的 像 . 如 果 你 有 疳 顺 , 这 是 一 手 丢 的 像
    1  4  6  7  8  import cv2  import numpy as np  from matplotlib import pyplot as pit  cv2. imread( •watch. jpg' , cv2. IMREAD GRAYSCALE)  Img =  imshow( • image • , img)  cv2.  waitKey(Ø)  cv2.  . destroyA11Windows ( )  cv2
    首 先 , 我 们 正 在 导 入 一 些 东 西 , 我 已 经 安 装 了 汶 三 个 模 块 。 接 下 来 , 我 们 将 {mg 定 义 为 cv2.r  ead(image file , parms) 。 默 认 值 是 IMREAD_COLOR 是 沿 有 任 何 alpha 通 道 的 颜 色 · 如 果 你  不 槧 悉 , a \] pha 是 不 透 明 度 ( 与 透 明 度 相 反 ), 如 槊 你 要 保 留 Alpha 通 道 , 也 可 以 使 用 IMREAD  UNCHANGED 。 很 多 时 佞 , 你 刽 戔 取 颜 色 版 不 , 然 后 将 其 转 为 灰 。 如 果 你 没 有 网 络 禍 像 机 , 这  将 是 你 在 不 教 程 中 使 用 的 主 要 方 法 即 加 载 图 骁  你 可 以 不 使 用 INREAD_COLOR 等 . 而 是 使 用 同 单 的 数 字 。 你 应 该 这 两 种 选 择 . 以 便 了 解  某 个 人 在 做 什 么 。 对 于 第 二 个 参 数 , 可 以 使 用 一 1 , 0 或 1 . 颜 色 为 1 , 灰 度 为 不 变 为  . 1 . 因 此 , 对 于 灰 度 , 可 以 执 行 cv2.imread(•uatch.jpg', 劬  一 目 载 完 成 @ 我 们 使 用 “ 2 . imshow(title, image) 来 显 示 图 骁 从 这 里 , 我 们 雙 用 “ 2 .wai  t 緶 y 〈 劬 来 等 待 , 直 到 有 任 何 按 踺 被 按 下 。 一 旦 完 成 , 我 们 使 用 cv2.destroyA11Windows() 来 关  闭 所 有 的 东 西 。
    正如前面提到的,你也可以用 Matplotlib 显示图像,下面是一些如何实现的代码:
    1  2  4  6  7  8  9  10  import cv2  import numpy as np  from matplotlib import pyplot as plt  cv2. imread( watch. jpg • , cv2. IMREAD GRAYSCALE)  Img  plt. imshow(img, cmap  •bicubic • )  • gray • , interpolation  plt.yticks([]) # to hide tick values on X and Y axis  linewidth=5)  plt.  plt. show( )
    请 注 意 , 你 可 以 绘 制 线 条 , 就 像 《 可 其 他 Matplot № 一 样 , 使 用 像 素 位 置 作 为 坐 标 的 。 不  过 , 如 果 你 想 绘 制 你 的 图 片 , Matp 恩 不 是 必 的 。 OpenCV 为 此 提 供 了 很 好 的 方 氵 去 。 当 你 完  成 修 改 后 , 你 可 以 保 存 如 下 所 示 :  CV2 . imurite('watchgray . png', img)  将 图 片 写 入 OpenCV 似 乎 很 容 易 , 昶 视 频 源 如 何 ? 在 下 个 教 程 中 , 我 们 将 展 示 如 何 肫 载 璺  像 头 臨 视 频 源 。  、 加 载 视 频 源  在汶 个 PythonOpenCV 教 程 中 . 我 们 将 给 . 绍 一 些 使 视 顿 和 摄 像 头 的 基 不 臊 作 。  处 来 自 禊 颜 的 帧 与 处 理 像 是 一 样 的 。 我 们 来 举 例 说 明 一 下  除 了 起 始 行
    1  2  3  4  7  3  9  10  11  12  13  14  15  import numpy as np  import cv2  cap = cv2. VideoCapture(Ø)  while(True)  ret, frame = cap. read()  gray = cv2. cvtC010r(frame,  cv2. imshow( 'frame ,gray)  if cv2. waitKey(1) & øxFF  break  . release()  cap  destroyA11Windows ( )  cv2.  cv2. COLOR 8GR2GRAY)
    首 先 , 我 们 导 入 numpy 和 cv2 , 没 有 什 么 特 别 的 。 接 下 采 , 我 们 可 以 cap : cv2.VideoCapt  聖 ( 明 。 这 将 从 你 计 笪 机 上 的 第 一 个 网 摄 像 头 返 回 视 频 。 如 果 你 正 在 观 看 视 颜 教 程 , 亻 寺 看  到 我 正 在 使 用 1 , 因 为 我 的 第 一 个 像 头 正 在 录 制 我 , 第 二 个 像 头 用 于 实 际 的 教 程 源 。  while(True) :  《 、 et , frame “ 《 ap . 《 聖 ad 〈 )  这 段 代 码 启 动 了 一 釒 呒 限 循 环 〔 秸 后 将 被 break 浯 切 打 破 ) , 其 中 ret 和 frame 被 定 义 为  cap. read() 。 基 不 上 ret 是 一 ' iM 弋 表 是 否 有 返 回 的 布 尔 盾 , frame 是@个返回的帧。 如 果  没 有 帧 , 你 不 会 得 到 谄 误 , 你 会 得 到 None 。  gray “ 匚 V2 . cvtCOIor(frames 匚 V2.COLOR_BGR2GRAY)  在 汶 里 , 我 们 定 义 一 价 哥 的 变 gray , 作 为 转 为 苁 应 的 帧 。 莊 意 这 个 R2CR “ 。 要 注  意 的 是 OpenCV 将 颜 色 读 取 为 BGR 〔 监 绿 色 红 色 0 但 大 多 数 计 算 机 应 用 程 序 读 取 为 RGB (  红 绿 蓝 记 任 涑 一 点 ·  cv2.imshou('frame•,gray)
    汪 意 , 尽 管 是 複 颇 流 , 我 们 仍 然 使 用 imshow 。 在 汶 里 , 我 们 展 示 了 转 为 灰 色 的 源 。  你 想 同 时 显 示 , 你 可 以 对 原 始 帧 和 灰 度 执 行 imshow , 将 出 现 两 个 窗 口 。  如 果  if cv2.waitKey(1) & OxFF  break  这 个 浯 旬 0 帧 只 运 行 一 次 。 基 丕 上 , 如 果 我 们 得 到 一 个 按 腱 , 那 个 键 是 q  e 循 环 , 然 后 运 行  cap.release()  02 . destroy 1 巛 neo ( )  这 将 释 放 网 络 摄 像 头 , 然 后 关 闭 所 有 的 imshow( ) 窗 口 。  在 某 些 情 况 下 , 你 可 能 实 际 上 霈 要 刮 , 并 将 录 制 内 容 保 荐 到 新 文 件 中 。  上 执 行 此 操 作 的 示 例 :  我 们 将 退 出 whil  以 下 是 在 Windo 、 处
    2  4  6  7  9  10  11  12  13  14  15  16  17  18  import numpy as np  import cv2  cv2.VideoCapture(1)  cap  cv2. • WID )  fourcc —  out cv2.VideoWriter( output.avi' ,fourcc,  while(True) :  cap. read()  ret, frame —  gray cv2. cvtC010r(frame,  out. write (frame)  cv2. imshow( frame ,gray)  if cv2.waitKey(1) & øxFF ord('q•)  break  . release()  release()  destroyA11Windows ( )  20.0,  (640,480))  cv2.COLOR BGR2GRAY)  cap  out.  cv2.
    这 里 主 要 要 注 意 的 是 正 旺 使 用 的 编 解 码 器 孬 以 及 在 while 循 环 之 前 定 义 的 输 出 信 息 。 然 后 , 在  while 循 环 中 . 我 们 使 用 out.write() 来 输 出 帧 。 最 后 , 在 while 循 环 之 外 , 在 我 们 释 放 摄 像  头 之 后 , 我 们 也 释 放 out 。  太 好 了 , 现 在 我 们 知 道 如 何 操 作 图 像 和 襖 频 。 如 果 你 没 有 网 络 像 头 , 你 可 以 使 用 图 像 甚 至 视  频 来 跟 随 教 程 的 其 厼 部 分 · 如 果 你 希 望 使 用 视 颇 而 不 是 络 像 头 作 为 源 , 则 可 以 为 颇 指 定 文  件 路 径 , 而 不 是 璺 像 头 号 码 。  现 在 我 们 可 以 使 用 来 源 了 , 让 我 们 来 示 如 何 绘 制 东 此 前 你 已 经 看 到 . 你 可 以 使 用 Matplot  》 ib 在 图 片 顶 部 绘 制 , 但 是 Matp ib 并 不 真 正 用 于 此 目 的 , 特 别 是 不 能 用 于 複 颜 源 。 幸 运 的 是  OpenCV 提 供 了 一 些 很 柽 的 工 具 , 来 帮 助 我 们 实 时 绘 制 和 标 记 我 们 的 源 , 这 就 是 我 们 将 在 下 一 个  教 程 中 讨 论 的 内 容 。
    在 图 像 上 绘 制 和 写 字  任这 个 PythonOpenCV 教 程 中 , 我 们 将 介 绍 如 何 在 像 和 襖 频 上 绘 制 各 种 形 状 。 想 要 以 某 种  方 式 标 记 检 測 到 的 对 象 是 相 当 普 诓 的 , 所 以 我 们 丿 、 类 可 以 很 容 易 地 看 到 我 们 的 程 序 是 否 按 照 我 们  的 希 望 工 作 。 一 个 例 孑 就 是 之 前 显 示 的 像 之 一
    import numpy as np  import cv2  img = cv2 .imread( •watch.jpg  , cv2 . IMREAD COLOR)
    下面,我们可以开始绘制,这样:
    1  2  3  4  5  line(img, (O,Ø), (150, 150), (255, 255, 255) , 15)  cv2.  . imshow( image' ,img)  cv2  wa itKey(Ø)  cv2.  . destroyA11Windows ( )  cv2
    cv2•1ine() 接 受 以 下 参 数 : 图 片 , 开 始 坐 标 , 结 束 坐 标  颜 色 (bgr) , 线 条 粗 细 。  结 果 在 这 里 .  好 吧 , 很 酷 , 让 我 们 绘 制 更 多 形 状 。 接 下 来 是 一 个 形  ( v2 , re 《 tang ( , 05 , 25L ( 2 ,1 a), ( e,e,2SS),1 轫  这 里 的 参 数 是 像 , 左 上 甬 坐 标 , 右 下 角 坐 标 , 颜 色 和 线 条 泪 细 。  塑 怎 么 样 ?  cv2.circ1e(img,(1øe,63), 5 三 。 (e,2ss,e),  汶 里 的 参 数 是 像 / 帧 , 圆 心 , 半 径 , 颜 色 和 。 汪 意 我 们 粗 细 为 . 1 。 汶 意 味 看 将 填 充 对 象  所 以 我 们 会 得 到 一 个 。  线 条 , 矩 形 和 塑 艮 酷 , 但 是 如 果 我 们 想 要 五 边 形 》 八 边 形 競 十 八 边 形 ? 没 问 题 !
    1  5  pts  # OpenCV documentation  # find this necessary,  *pts • pts.  np.int32)  had this code, which reshapes the array to a 1 x 2  but you may;  1,2))  . 1 did  cv2.p01y1inesCimg, [pts], True, 3)
    , Pts , cv2.p01y1ines  font cv2.FOUT HERSHEY SIMPLEX  cv2.putText(img, •openCV Tuts!  font, 1, 2,  cv2. LINE_AA)
    2  4  6  7  8  9  11  12  13  14  15  import numpy as np  import cv2  img imread( •watch. jpg • , cv2. IMREAD_COLOR)  cv2. line(img, (e, 0), (2øø, 3øe) , (255,255, 255) ,5e)  cv2. img, (50e , 250), aøøe , see) , (O,ø, 255) ,15)  cv2.circ1e(img, (447,63), 63, -1)  pts  pts =  polylines(img, [pts], True, (8,255, 255), 3)  font = cv2.FONT HERSHEY SIMPLEX  np. int32)  cv2.putText(img, 'OpenCV ruts! font, 6, 13,  cv2. imshow( • image' , img)  cv2. waitKey(e)  cv2. destroyA11WindowsO  cv2. LINE_AA)
    在下一个教程中,我们将介绍我们可以执行的基本图像操作。
    四、图像操作
    在 OpenCV 教程中,我们将介绍一些我们可以做的简单图像操作。 每个视频分解成帧。 然后每一帧,就像一个图像,分解成存储在行和列中的,帧/图片中的像素。 每个像素都有一个坐标位置,每个像素都由颜色值组成。 让我们列举访问不同的位的一些例子。
    我们将像往常一样读取图像(如果可以,请使用自己的图像,但这里是我在这里使用的图像)
    import cv2  import numpy as np  img = cv2.imread( 'watch . jpg' ,cv2. INREAD COLOR)  PX = img[SS,SS]  print(px)  , ROI , :  print(px)
    ROI , :  lee: lsa)  print(img. shape)  print(img. size)  print(img. dtype)  watch face  = watch_face  cv2. imshow( image' , img)  cv2 . waitKey(ø)  cv2.  https://pyrhonprogramming.net/static/images/opencv/opencv-python-image-oeprations-  tutorial.png
    五 、 图 像 算 术 和 逻 辑 运 算  欢 迎 来 到 另 一 个 Python OpenCV 教 程 , 在 丕 教 程 中 , 我 们 将 介 绍 一 些 筒 单 术 运 算 , 我 们 可 以  在 像 上 掬 行 的 , 并 解 释 它 们 的 作 用 。 为 此 , 我 们 将 橥 要 两 个 相 同 大 小 的 圈 像 来 开 始 , 然 后 是 一  , 铿 交 小 的 像 和 一 个 较 大 的 图 像 。 首 先 , 我 将 使 用
    首先,让我们看看简单的加法会做什么:
    1  2  4  6  7  8  9  10  11  12  import cv2  import numpy as np  # x 25B  img1 = cv2. imread( • 3D-Matplotlib.png•)  img2 = cv2. imread( •mainsvmimage.png• )  add  img1+img2  . imshow( add' , add)  cv2  wa itKey (0)  cv2.  . destroyA11Windows ( )  cv2
    结 果 .  你 不 可 想 要 这 种 混 & 加 法 。  什 么  add “ 亡 v2 . dd ( , 吨 1, g2 )  结 果 :  OpenCV 有 一 个 。 加 法 255 ) 这 是 因 为 颜 色 是 0 一 255 , 其 中 255 : 2e5 , 381 , 27g 4 《 奂 冫 〈 2e5 , 2 接 下 来 , 我 们 可 以 添 加 图 像 , 并 可 以 假 设 每 个 图 像 都 有 不 同 的 “ 权 重 “ 。 这 是 如 何 工 作 的 .” class=”align-none”>
    1  4  6  7  9  10  import  import  img1  img2  cv2  numpy as np  cv2. imread( • 3D-Matplotlib. png • )  cv2.imread( mainsvmimage. png )  weighted = cv2. addWeighted(img1, 0.6, img2,  cv2. imshow( weighted , weighted)  cv2. waitKey (0)  cv2. destroyA11Windows ( )  0.4,  0)
    对 于 addÅeighted 方 法 , 参 赦 是 第 一 个 像 , 权 重 , 第 二 个 像 , 权 重 , 然 后 是 伽 马 , 这 是  一 个 氵 翡 《 测 量 值 。 我 们 现 在 就 吧 它 保 为 雩 。  这 些 是 一 些 额 外 的 畢 , 但 如 果 你 真 的 想 将 一 个 像 添 加 到 另 一 个 , 最 新 的 重 臨 在 哪 里 ? 在 这  种 情 况 下 , 你 会 从 最 大 的 丹 始 , 然 后 添 加 较 小 的 图 像 . 为 此 , 我 们 将 使 用 相 同 的 3D-natplotlib  .png 像 , 但 使 用 一 个 新 的 Pythonfis .  现 在 , 我 们 可 以 选 取 这 个 标 志 , 卉 把 它 放 在 原 始 像 上 。 这 很 容 易 〔 慕 不 上 使 我 们 在 前 一 个  教 程 中 使 用 的 相 同 代 码 , 我 们 用 一 个 新 的 乐 西 替 嵝 了 图 像 区 域 ( ROI ) 〕 , 但 是 如 果 我 们 只 想 要 标  志 部 分 而 不 是 臼 色 背 景 呢 ? 我 们 以 使 用 与 之 前 用 于 R 创 涣 相 同 的 原 理 , 但 是 我 们 要 一 种 方  氵 去 来 “ 去 除 . 标 志 的 背 景 , 使 得 自 色 不 会 不 之 要 地 阝 巨 当 更 多 背 景 像 。 首 先 我 将 显 示 完 整 的 代 码 ,  然 葛 释 .
    1  2  4  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  23  24  25  26  27  import  import  # Load  img1  img2  cv2  numpy as np  two images  cv2. imread( 3D-Matplotlib. png )  cv2. imread( ' mainlogo. png' )  # I want to put logo on top-left corner,  rows, cols, channels = img2. shape  roi = img1[Ø: rows, 0: cols ]  So I create a ROI  # Now create a mask of logo and create its inverse mask  img2gray = cv2. cvtC010r(img2, cv2. COLOR BGR2GRAY)  # add a threshold  on. threshold(img2gray, 220, 255, cv2.THRESH BINARY INV)  ret, mask  cv2. bitwise_not(mask)  mask inv  # Now black-out the area of logo in ROI  = mask_inv)  imgl_bg = cv2. bitwise  # Take only region of  logo from logo image.  img2_fg = cv2. img2,mask = mask)  dst = cv2. img2_fg)  0: cols ] —  dst
    Python OpenCV入门 - 图30
    这 里 友 生 了 很 多 事 情 , 出 现 了 一 一 些 新 的 东 西 。 我 们 首 先 看 到 的 是 一 价 的 值 : ret, mask .  cv2.thresh01d(img2gray, 220 , 255 , cv2. THRESH_BINARY INV)  我 们 将 在 下 一 个 教 程 中 介 绍 更 多 的 或 值 , 所 以 谲 继 续 关 注 具 体 内 容 , 但 基 朩 上 它 的 工 作 方 式 是  根 据 值 将 所 有 像 紊 转 嵝 为 黑 色 或 自 色 。 在 我 们 的 例 子 中 , 或 值 是 220 , 但 是 我 们 可 以 使 用 其 他  值 , 或 者 甚 至 动 态 地 选 择 一 个 , 这 是 ret 变 量 可 以 使 用 的 值 。 接 下 来 , 我 们 看 到 : mask_inv ;  cv2.bitwise-not(mask) . 这 是 一 个 按 位 操 作 。 基 丕 上 , 这 些 作 符 与 Pyth 。 n 中 的 型 操 作 符  非 常 相 似 , 除 了 一 点 , 但 我 们 不 会 在 这 里 触 及 它 。 在 涑 种 情 况 下 , 不 酊 见 的 部 分 是 黑 色 的 地 方 。  然 后 , 我 们 可 以 说 , 我 们 想 在 第 一 个 图 像 中 将 这 , 个 区 域 遮 任 , 然 后 将 空 白 区 域 酱 为 图 像 2 的 内  容 。
    下 个 教 程 中 , 我 们 深 入 讨 论 阈  欢 迎 阅 读 另 一 个 OpenCV 教 程 。 在 朩 教 程 中 。 我 们 将 介 绍 像 和 複 分 析 的 阈 值 。 式 值 的 思 想  是 进 一 步 简 化 视 觉 数 据 的 分 析 。 首 先 , 你 可 以 转 嵝 为 灰 , 但 是 你 老 须 考 虑 灰 度 仍 然 至 少 255  个 俏 。 國 僨 可 以 做 的 事 情 , 在 是 基 朩 的 层 面 上 , 是 慕 于 國 值 将 所 有 东 西 都 转 焕 成 白 色 或 黑 色 · 比  方 说 , 我 们 希 望 國 值 为 125 〔 最 大 为 255 〕 , 那 么 125 以 下 的 所 有 内 吝 都 将 被 转 嵝 为 0 或 黑 色 ,  而 高 于 125 的 所 有 内 容 胡 将 被 转 涣 为 255 或 彐 色 。 如 果 你 像 平 常 一 样 转 成 灰 度 , 你 会 变 成 日 色  和 黑 色 . 如 果 你 不 转 嵝 灰 度 , 你 会 得 到 二 化 的 图 片 , 但 会 有 颜 色 。  虽 然 这 听 起 来 不 满 , 但 適 常 不 是 。 我 们 将 在 这 里 介 绍 多 个 示 例 和 不 同 鲞 型 的 阈 喳 来 说 明 这 一 点  。 我 们 将 使 用 下 面 的 图 片 作 为 我 们 的 示 例 片 , 但 可 以 随 意 使 用 你 自 己 的 图 片 .
    这 个 书 的 图 片 就 是 个 很 好 的 例 子 , 说 明 为 什 么 一 个 人 可 能 要 或 0 首 先 , 背 景 根 不 没 有 白 色  , 一 切 都 是 暗 淡 的 , 而 目 一 切 都 是 变 化 的 。 有 些 部 分 很 容 易 克 读 , 另 一 部 分 则 非 常 暗 , 要 相 当  多 的 注 意 力 才 能 识 剐 出 来 。 首 先 , 我 们 尝 试 一 个 简 单 的 值  retval, threshold 。 cv2 . threshold(img, 10 255 孬 0 / 2 .THRESH BINAR 、 ')  二 元 或 值 是 个 简 单 的 。 是 砌 下 是 . 的 式 值 , 其 中 像 素 为 255 或 0 。 在 很 多 情 况 下 , 汶 白 色 或 黑 色  但 我 们 已 经 为 我 们 的 图 像 保 茔 了 颜 色 , 所 以 它 仍 然 是 彩 色 的 。 这 里 的 第 一 个 参 镦 是 图 像 . 下 一  个 参 数 是 成 值 , 我 们 选 择 1 ‰ 下 一 个 是 最 大 值 , 我 们 选 择 为 255 。 是 后 是 歲 值 鲞 型 , 我 们 选 择 了  THRESH_BINARY 。 適 常 情 况 下 , 10 的 阈 匾 会 有 差 。 我 们 苛 择 10 , 因 为 这 是 低 光 照 的 片 , 所  以 我 们 选 择 低 的 数 字 。 常 125 . 150 左 右 的 东 西 可 旨 果 最 好 。
    1  2  6  7  8  9  import cv2  import numpy as np  img = cv2. imread(' bookpage.jpg')  cv2. threshold (img,  retval, threshold  cv2. imshow( original , img)  cv2. imshow( threshold ' , threshold)  cv2. waitKey (0)  cv2. destroyA11Windows (  12,  255,  cv2. THRESH BINARY)
    import cv2  import numpy as np  grayscaled -  retval, threshold cv2. threshold(grayscaled, le, 2SS.  imshow( original ' , ing)  cv2.  cv2. imshou( 'thresh02d• *threshold)  cv2.waitKey(e)  destroyA11Windows()  cv2.  cv2. THRESH_BINARY)
    更简单,但是我们仍然在这里忽略了很多背景。 接下来,我们可以尝试自适应阈值,这将尝试改变阈值,并希望弄清楚弯曲的页面。
    4  6  8  import cv2  import numpy as np  th • cv2. adaptiveThresh01d(graysca1ed,  . THRESH BINARY, 115, 1)  c v2  . imshow( • original , img)  c v2  cv2.imshow( • Adaptive threshold • ,th)  waitKey(Ø)  cv2.  cv2. destroyA1 IWindows ( )  255,  cv2.ADAPTIVE THRESH GAUSSIAN C,
    还有另一个版本的阈值,可以使用,叫做大津阈值。 它在这里并不能很好发挥作用,但是:
    1  2  4  5  cv2. threshold(  retva12, threshold 2  THRESH BINARY+cv2.THRESH OTSU)  cv2. imshow( original • , img)  cv2.imshow( 'Otsu threshold ,thresh01d2)  cv2.waitKey(Ø)  cv2. destroyA11Windows ( )
    七 、 颜 色 过 滤  在 汶 个 PythonOpenCV 教 程 中 , 我 们 将 介 绍 如 何 创 建 一 个 过 滤 器 , 回 顾 按 位 操 作 , 其 中 我 们 将  过 滤 特 定 的 颜 色 , 试 显 示 它 。 或 者 》 你 也 可 以 亏 门 筛 选 出 特 定 的 颜 色 , 然 后 将 具 焕 为 场 景  就 像 我 们 用 具 他 方 氵 去 替 焕 R 劊 〔 像 区 域 ) 一 样 , 就 像 绿 屏 的 工 作 方 式 .  为 了 像 这 样 过 滤 , 你 有 几 个 选 顶 . 通 常 , 你 可 能 会 将 你 的 颜 色 转 庾 为 SV , 即 “ 色 调 和 度 纯 度  。 侨 日 汶 可 以 帮 助 你 根 庭 色 调 和 泡 和 度 范 围 , 使 用 变 化 的 值 确 定 一 个 更 具 体 的 颜 色 。 如 果 你 希  望 的 话 , 你 可 以 实 际 生 成 基 于 BGR 佰 的 过 滤 器 , 但 是 这 会 有 点 困 唯 。 如 果 你 很 唯 可 视 化 HSV ,  不 要 感 到 失 落 , 查 看 维 基 百 科 页 面 上 的 HSV . 那 里 有 一 个 非 常 有 用 的 条 形 让 你 可 视 化 它 。 我 最 好  辛 自 描 述 颜 色 的 色 调 泡 和 度 和 纯 度 。 现 在 让 我 们 开 始 :
    2  4  7  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  import cv2  import numpy as np  cap = cv2.VideoCapture(Ø)  6 v while(l)•  cap. read()  frame  cv2.cvtC010r(frame, cv2.COLOR BGR2HSV)  hsv  lower_red = np. 5B\])  upper_red =  cv2.inRange(hsv, lower_red, upper_red)  mask  cv2. mask= mask)  cv2. imshow( frame' ,frame)  cv2. imshow( mask ,mask)  cv2. imshow( res , res)  k = cv2.waitKey(5) & ØxFF  if k  27:  break  cv2. destroyA11Windows ( )  . release()  cap
    这 只 是 一 个 例 子 孬 以 红 色 为 目 标 。 它 的 工 作 方 式 是 , 我 们 所 看 到 的 是 我 们 范 围 内 的 任 何 东 西 ,  慕 朩 上 是 30 一 255 050 . 255 和 50080 。 它 用 于 红 色 , 但 切 以 便 尝 试 找 到 自 己 的 颜 色 。 HSVE  汶 里 效 果 好 的 原 因 是 . 我 们 想 要 范 围 肉 的 颜 色 , 汶 里 我 们 適 总 要 相 似 的 颜 色 。 很 多 时 候 , 典  型 的 红 色 仍 然 会 有 一 些 绿 色 和 蓝 色 分 量 , 所 以 我 们 必 允 讦 一 些 绿 色 和 色 , 但 是 我 们 会 想 要 几  乎 全 红 。 这 意 味 看 我 们 会 在 这 里 祆 得 所 有 颜 色 的 低 光 混 口  为 了 确 定 HSV 的 范 围 , 我 认 为 最 好 的 方 法 就 是 试 谄 . 0 四 nCV 内 置 了 将 BGR 转 为 HSVäj  方 法 。 如 槊 你 想 洮 单 一 的 颜 色 , 那 么 8GR 到 HSV 将 会 很 好 用 。 为 了 教 学 , 下 面 是 这 个 代 码  的 一 个 例 子 .  冠 引 、 k red  : np . nt8 ( [ [ 0 乙 2 乙 121 月 l)  dark red “ 亡 V2.cvtC010r(dark red, 亡 2 . COLOR_BGR2HSV)](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639544531830-f8b2e97f-c8fb-410a-b656-d942fcea6540.jpg)<br />![这 里 的 结 果 是 一 个 HSV 值 , 与 dark_red 值 相 同 。 这 很 棒 但 是 , 同 样 你 遇 到 了 颜 色 范 围 和  HSV 范 围 的 基 问 题 。 他 们 根 不 同 。 你 可 能 台 理 使 用 BGR 范 围 , 它 们 仍 然 可 以 工 作 , 但 是 对  于 检 测 一 种 “ 颜 色 ](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639544531958-faab964c-1d6d-4ae1-bde7-69ab7d46f32a.jpg)<br />八、模糊和平滑<br />
在这个 Python OpenCV 教程中,我们将介绍如何尝试从我们的过滤器中消除噪声,例如简单的阈值,或者甚至我们以前的特定的颜色过滤器:<br />正如你所看到的,我们有很多黑点,其中我们喜欢红色,还有很多其他的色点散落在其中。 我们可以使用各种模糊和平滑技术来尝试弥补这一点。 我们可以从一些熟悉的代码开始:<br />![1  2  3  4  7  8  9  10  11  12  13  14  15  import cv2  import numpy as np  cap = cv2. VideoCapture(Ø)  while(l)  = cap. read()  frame  cv2. cvtC010r(frame, cv2.COLOR BGR2HSV)  hsv  lower_red = np. 5B\] )  upper_red = np.  cv2. inRange(hsv, lower_red, upper_red)  mask  cv2. mask= mask)
    1  2  4  5  6  7  9  la  11  kernel = float32)/225  smoothed = cv2. filter2D(res, -1, kernel)  cv2. imshow( Original Frame)  cv2. imshow( Averaging , smoothed)  k = cv2.waitKey(5) & øxFF  if k  27:  break  destroyA11Windows ( )  cv2.  . release ( )  cap
    medi an  cv2.imshow( •Median Blur' *median)  åf.png  bilateral  cv2.imshow( •bilateral Blur • , bilateral)  n-tutonaupg
    九 、 形 态 变 换  在 这 个 PythonO 四 nCV 教 程 中 , 我 们 将 介 绍 形 态 变 。 些 是 一 些 閭 单 操 作 , 我 们 可 以 基 于  图 像 形 状 执 行 。  我 们 要 谈 的 第 一 对 是 腐 忡 和 蟛 胀 : 腐 忡 是 我 们 将 这 腐 攰 缘 。 它 的 工 作 方 式 是 使 用 滑 块 〔 核 )  。 我 们 让 滑 块 滑 动 , 如 果 所 有 的 像 素 是 白 色 的 , 那 么 我 们 得 到 白 色 , 否 则 是 黑 色 。 这 可 能 有 助 于  消 除 一 些 0 色 噪 音 . 另 一 个 版 不 是 澎 胀 , 它 基 丕 上 是 相 反 的 : 让 滑 块 滑 动 , 如 果 整 个 区 域 不 是 黑  色 的 , 就 会 转 成 臼 邑 这 是 一 个 例 子 .
    1  import cv2  2  import numpy as np  cv2. VideoC apture (0)  cap  6 v while(l)  7  cap. read()  8  frame =  cv2. cvtC010r(frame, cv2.COLOR BGR2HSV)  9  hsv  10  lower_red = 50\])  11  12  upper_red =  13  mask = cv2. inRange(hsv, lower_red, upper_red)  14  cv2. mask= mask)  15  16  np uint8)  17  kernel  cv2. erode (mask , kernel , iterations  18  erosion  cv2. dilate(mask, kernel, iterations = 1)  19  dilation  20  cv2. imshow( Original , frame)  21  cv2. imshow( •Mask' ,mask)  22  cv2. imshow( • Erosion • , erosion)  23  cv2. imshow( ' Dilation ,dilation)  24  25  k = cv2.waitKey(5) & øxFF  26  27  if k  27:
    28  29  30  31  break  cv2. destroyAIIWindows ( )  cap. releaseo
    下一对是“开放”和“关闭”。 开放的目标是消除“假阳性”。 有时在背景中,你会得到一些像素“噪音”。 “关闭”的想法是消除假阴性。 基本上就是你检测了你的形状,例如我们的帽子,但物体仍然有一些黑色像素。 关闭将尝试清除它们。
    cv2. VideoCapture(1)  1  cap  2  3 v while(l) .  4  cap. read()  frame  cv2.cvtC010r(frame, cv2.COLOR 8GR2HSV)  6  hsv  7  lower_red = 50\])  8  9  upper_red = np.  10  cv2. inRange(hsv, lower_red, upper_red)  11  mask  res = cv2. mask= mask)  12  13  14  np. ones uint8)  kernel  15  opening = cv2. morphologyEx(mask, cv2. MORPH OPEN, kernel)  16  closing = cv2.morph010gyEx(mask, cv2.MORPH CLOSE, kernel)  17  18  cv2. imshow( Original Frame)  19  cv2. imshow( 'Mask' ,mask)  cv2. imshow( Opening' ,opening)  cv2. imshow( Closing' , closing)  22  23  k = cv2.waitKey(5) & øxFF  24  25  if k  27:  26  break  27
    28  29  cv2. destroyA11Windows ( )  cap. release()
    tophat blackhat , :  # It is the difference  between input image and Opening of the image  cv2. imsh0W( ' Tophat' , tophat)  # It is the  difference between the closing of the input image and input image.  cv2. imshow( Blackhat ' , blackhat)
    在下一个教程中,我们将讨论图像渐变和边缘检测。
    十、边缘检测和渐变
    欢迎阅读另一个 Python OpenCV 教程。 在本教程中,我们将介绍图像渐变和边缘检测。 图像渐变可以用来测量方向的强度,边缘检测就像它所说的:它找到了边缘! 我敢打赌你肯定没看到。
    首先,我们来展示一些渐变的例子:
    1  import cv2  2  import numpy as np  3  cv2. VideoCapture(1)  4  cap —  6 v while(l).  7  8  # Take each frame  cap. read()  9  frame  cv2.cvtC010r(frame, cv2.COLOR BGR2HSV)  10  hsv  11  lower red = np. 50\])  12  13  upper_red =  14  cv2. inRange(hsv, lower_red, upper_red)  15  mask  cv2. mask= mask)  16  17  cv2. 64F)  18  laplacian  sobelx = cv2. Sobel(frame, cv2.CV ksize=5)  19  sobely = cv2. Sobel(frame, cv2.CV ksize=5)  21  imshow( 'Original , frame  22  cv2.  . imshow( 'Mask' ,mask)  23  cv2  . imshow( laplacian , laplacian)  24  cv2  imshow( ' sobelx' , sobelx)  25  cv2.  . imshow( sobely• , sobely)  26  cv2  27
    28  29  30  31  32  33  cv2. waitKey(5) & øxFF  k  if k =  27:  break  destroyA11Windows ( )  cv2.  . release ( )  cap
    1  import cv2  2  import numpy as np  cv2.VideoCapture(Ø)  4  cap  6 • while(l)  7  cap. read()  8  frame  cv2.cvtC010r(frame, cv2.COLOR 8GR2HSV)  9  hsv  11  lower_red = np.  12  upper_red =  13  14  15  16  17  18  19  20  21  22  23  24  25  26  mask  res  = cv2.inRange(hsv, lower_red, upper_red)  cv2. mask= mask)  cv2  cap  cv2. imshow( Original , frame)  edges  cv2. imshow( Edges ,edges)  cv2. waitKey(5) & øxFF  k  if k 27  break  . destroyA11Windows ( )  . release()
    这真是太棒了! 但是,这并不完美。 注意阴影导致了边缘被检测到。 其中最明显的是蓝狗窝发出的阴影。
    在下一个 OpenCV 教程中,我们将讨论如何在其他图像中搜索和查找相同的图像模板。
    十 一 、 模 板 匹 配  欢 迎 阅 读 另 一 个 thonOpenCV 教 程 , 在 丕 教 程 中 , 我 们 将 介 绍 对 象 识 别 的 一 个 基 丕 版 丕 。  汊 里 的 想 法 是 , 给 出 一 定 的 成 0 , 找 到 匹 配 我 们 提 供 的 板 图 像 的 相 同 区 域 。 对 于 具 体 的 对 象 匹  配 , 具 有 精 确 的 照 明 / 刻 劊 角 度 , 这 可 以 工 作 得 很 好 。 通 常 会 遇 到 这 些 情 况 的 例 子 就 是 计 算 机 上 的  任 何 GL 月 。 按 等 西 总 是 相 同 的 . 所 以 你 可 以 使 用 夜 板 匹 配 。 结 合 板 匹 配 和 一 些 标 椏 制  你 已 经 实 现 了 一 个 基 于 Web 的 机 器 人 !  首 先 , 你 需 要 一 个 主 要 图 像 和 一 个 模 板 。 你 应 该 从 你 正 在 图 像 中 查 找 的
    这只是其中一个端口,但我们很好奇,看看我们是否可以匹配任何其他端口。 我们确实要选择一个阈值,其中某种东西可能是 80% 匹配,那么我们说这就匹配。 所以,我们将开始加载和转换图像:
    1  2  3  4  5  6  7  8  import cv2  import numpy as np  cv2. imread ( opencv -template-matching-python-tutorial. j pg • )  img_rgb  img_gray = cv2. cv2. COLOR 8GR2GRAY)  cv2. imread( opencv-template-for-matching. jpg  template  w, h = template. shape[: : -1]
    到目前为止,我们加载了两个图像,转换为灰度。 我们保留原始的 RGB 图像,并创建一个灰度版本。 我之前提到过这个,但是我们这样做的原因是,我们在灰度版本上执行所有的处理,然后在彩色图像上使用相同的标签来标记。
    对于主要图像,我们只有彩色版本和灰度版本。 我们加载模板并记下尺寸。
    1  cv2. cv2.TM CCOEFF NORMED)  res —  threshold = 0.8  loc = np.where( res threshold)
    , itng_gray , , matChTem  plate ,  res . , 80%. ,  res mm.  for pt in  cv2.rectangle(img_rgb, pt. (pt[el + w, pt[ll + h), (8,2SS.2SS),  cv2. imshow( 'Detected' , img_rgb)  2)](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639544533796-c9cfb236-4639-4658-b21b-3b6098ef1a87.jpg)<br />所以我们得到了几个匹配。也许需要降低阈值?我们试试 0.7。<br />![这 里 有 一 些 阳 性 。 你 可 以 继 续 调 整 门 槛 , 亘 到 你 达 到 100 % , 但 是 如 槊 没 有 假 阳 性 , 你 可 能  永 远 不 会 达 到 它 。 另 一 个 选 择 就 是 使 用 另 一 个 模 板 像 。 有 时 候 , 使 用 相 同 对 象 的 多 个 图 像 是 有  用 的 。 这 样 . 你 可 以 值 足 够 高 的 , 来 保 你 的 结 果 准 谁 。  在 下 一 首 程 中 , 我 们 将 介 绍 前 景 提 取 。](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639544533903-ca6f5d59-bafb-47b4-90bb-4ac61426c8f5.jpg)<br />十二、GrabCut 前景提取<br />
欢迎阅读 Python OpenCV 前景提取教程。 这里的想法是找到前景,并删除背景。 这很像绿屏,只是这里我们实际上不需要绿屏。<br />
首先,我们将使用一个图像:<br />
随意使用你自己的。<br />
让我们加载图像并定义一些东西:<br />![1  2  4  6  7  8  9  11  import numpy as np  import cv2  from matplotlib import pyplot as plt  img = cv2. imread( opencv-python-foreground-extraction -tutorial. jpg' )  np. zeros (img. shape[ : 2] , np. uint8)  mask  np. zeros( (1, 65) , np. float64)  bgdMode1  np. zeros ( (1, 65) float64)  fgdMode1  rect = (161,
    到 巨 前 为 止 , 我 们 已 经 , 了 “ 2 @ numpy 和 matplotlib 。 然 后 我 们 载 像 , 创 建 一 个  掩 码 , 指 定 篡 法 内 部 使 用 的 背 景 和 前 景 模 型 。 真 正 重 要 的 部 分 是 我 们 定 义 的 矩 形 。 这 是 rect .  (start x , start_y, width, height)  这 是 包 围 我 们 的 主 要 对 象 的 矩 形 。 如 果 你 正 在 哽 用 我 的 图 片 , 那 就 是 要 使 用 的 阵 。 如 果 你 使  用 自 己 的 , 找 到 适 合 你 的 像 的 坐 标 。  下 面
    1  2  6  7  cv2. rect, INIT WITH RECT)  np. where( (mask==2) I (mask==Ø) 1) . astype( uint8 )  mask2  , np. newaxis \]  Img —  plt. imshow(img)  plt. colorbar()  plt. show()
    下个教程中,我们打算讨论如何执行角点检测。
    十三、角点检测
    欢迎阅读 Python OpenCV 角点检测教程。 检测角点的目的是追踪运动,做 3D 建模,识别物体,形状和角色等。
    对于本教程,我们将使用以下图像:
    1  2  4  6  7  8  9  import numpy as np  import cv2  img = cv2. imread( opencv-corner-detection-sample.jpg• )  gray = cv2. cvtC010r(img, cv2. COLOR BGR2GRAY)  gray = np.f10at32(gray)  corners  corners  cv2.goodFeaturesToTrack(gray, 100,  np. intø(corners)  0.01,
    到 目 前 为 止 , 我 们 加 载 图 像 , 为 灰 度 , 然 后 是 float32 。 接 下 采 , 我 们 用 goodFeatures  Torrack 函 数 检 晁 角 点 。 送 里 的 参 数 是 像 , 检 测 到 的 最 大 0 点 数 量 , 品 质 和 0 之 间 的 最 小 距  离 。 如 前 所 述 , 我 们 在 汶 里 的 诓 齿 问 题 将 允 许 找 到 许 多 角 点 , 所 以 我 们 对 其 进 行 了 限 制 。 下 面  for in :  x , y : corner 、 .ravel()  耵 2 还 置 r le ( img, ( 又 ,y ) 3J2 三  0 ' 2 “ ho “ ( 'Corner 飞 img)  现 在 我 们 历 丽 个 角 点 , 在 我 们 认 为 是 点 的 个 点 上 画 一 个 圆 。
    十四、特征匹配(单映射)爆破
    欢迎阅读 Python OpenCV 特征匹配教程。 特征匹配将是稍微更令人印象深刻的模板匹配版本,其中需要一个完美的,或非常接近完美的匹配。
    我们从我们希望找到的图像开始,然后我们可以在另一幅图像中搜索这个图像。 这里的完美是图像不需要相同的光照,角度,旋转等。 特征只需要匹配。
    首先,我们需要一些示例图像。 我们的“模板”,或者我们将要尝试匹配的图像:
    在 这 里 , 我 们 的 模 板 像 在 模 板 中 , 比 在 我 们 要 攫 素 的 图 像 中 要 小 一 些 。 它 的 旋 转 也 不 同 , 明  影 也 有 些 不 同 。  现 在 我 们 将 使 用 一 种 “ 爆 破 ' : 匹 配 的 形 式 . 我 们 将 在 这 两 个 像 中 找 到 所 有 特 征 。 然 后 我 们 匹 配  这 些 特 征 。 然 后 , 我 们 可 以 绘 制 我 们 想 要 的 , 尽 可 能 多 的 匹 配 。 但 是 要 小 心 。 如 果 你 绘 制 5  个 匹 配 , 你 会 有 很 多 误 报 。 所 以 只 绘 制 绘 制 前 几 个 。
    1  2  3  6  import  import  import  imgl  img2  numpy as np  cv2  matplotlib. pyplot as plt  cv2. imread( opencv -feature-matching-template. jpg • , 0)  cv2. imread( opencv-feature-matching-image. jpg , 0)
    img2 ) .  orb =  kp1, desl - orb .detectAndCompute(img1, None)  kp2. des2 orb. detectAndCompute(img2, None)  , orb  bf = crosscheck-True)  BFmatcher  matches bf.  matches sorted(matches, key lambda x:x.distance)  img3 = cv2.drauMatches(img1  pit. imshow( img3)  pit. show()  10  , BLtä*fi ( imgl  flags—2)
    十五、MOG 背景减弱
    在这个 Python OpenCV 教程中,我们将要讨论如何通过检测运动来减弱图像的背景。 这将要求我们回顾视频的使用,或者有两个图像,一个没有你想要追踪的人物/物体,另一个拥有人物/物体。 如果你希望,你可以使用你的摄像头,或者使用如下的视频:
    这里的代码实际上很简单,就是我们现在知道的:
    1  2  4  6  8  9  11  12  13  14  15  16  17  18  19  20  21  22  import numpy as np  import cv2  cv2.VideoCapture( ' people-walking. mp4 )  cap  fgbg = cv2. createBackgroundSubtractorMOG2()  while(l) •  cap. read ( )  ret, frame  fgmask = fgbg. apply(frame)  cv2. imshow( 'fgmask' ,frame)  cv2. imshow( frame ,fgmask)  cv2.waitKey(3Ø) & Øxff  k  if k  27:  break  cap. release( )  . d estroyA11WindowsC)J  cv2
    汶 里 的 去 是 从 静 态 背 景 中 提 取 移 动 的 前 景 . 你 也 可 以 使 闱 这 个 来 比 较 两 个 相 似 的 像 , 并 立  即 提 取 它 们 之 间 的 差 异 。  我 们 的 例 子 中 , 我 们 可 以 看 到 我 们 确 实 已 经 测 到 了 一 些 人 , 但 是 我 们 确 实 有 一 些 “ 噪 音 0 噪  音 实 际 上 是 树 叶 在 周 围 的 风 中 移 动 了 一 下 。 只 要 我 们 知 道 一 柳 ! > 噪 音 的 方 法 。 等 一 下 ! 我 们 的  确 知 道 ! 一 个 疯 狂 的 挑 战 已 经 出 现 了 你 面 前 !  接 下 来 的 教 程 开 始 让 我 们 远 离 滤 瞳 或 变 的 应 用 , 并 让 我 们 使 用 Haarcascades*t&— 般 对  象 , 例 如 面 部 检 测 等 等 。  十 六 、 Haar cascade 面 部 楦 测  在 汶 个 python OpenCV 教 程 中 , 我 们 将 讨 论 Haar Cascades 对 象 检 l, 我 们 将 从 脸 部 和 眼 瞒  检 测 来 开 始 。 为了使用层@文件进行对象识别/检是l, 首先需要层@文件。 对 于 非 常 流 行 的 任 务  这 些 已 经 存 在 。 检 到 部 , 汽 车 , 笑 崆 , 眼 瞄 和 车 牌 等 东 西 都 是 非 帛 萏 的 。  首 先 , 我 会 叾 诉 仂 麵 何 使 用 这 些 层 文 件 , 然 后 我 将 告 诉 你 如 何 开 始 创 建 你 自 己 的 层 , 样  你 就 可 以 检 测 到 任 何 你 想 要 的 对 象 , 这 很 酷 !  你 可 以 使 用 Google 来 查 找 你 可 铙 要 检 测 的 东 西 的 各 种 Haar Cascades, 对 于 找 到 上 述 类 型  , 你 应 该 没 有 太 多 的 麻 烦 。 我 们 将 使 用 层 和 层 。 你 可 以 EHaarCascades 的 根巨  录 找 到 更 多 。 谲 注 意 用 于 使 用 / 分 发 这 些 Haar Cascades 的 许 可 证 。  让 我 们 开 始 我 们 的 代 码 。 我 假 设 你 已 经 从 上 面 的 链 接 中 下 载 了 haarcascade_eye. 狮 1 和 haarc  ascade_frontalface_default .xml 并 丬 # 汶 些 文 亻 牛 茳 々 在 有 页 目 的 目 录 中 .
    1  2  3  5  6  7  8  9  10  11  import numpy as np  import cv2  # multiple cascades: https://github.com/ltseez/opencv/tree/master/data/  haarcascades  #https://github.com/Itseez/opencv/blob/master/data/haarcascades/  haarcascade frontalface default .xml  face_cascade cv2. CascadeC1assifier( • )  #https://github.com/Itseez/opencv/blob/master/data/haarcascades/  haarcascade_eye. xm1  eye_cascade — cv2.CascadeC1assifier( • haarcascade_eye.xml')  cap — cv2. VideoCapture(Ø)
    While I:  ret,  , cv2 numpy ,  img cap. read()  gray = cv2.cvtc010r(img, cv2.COLOR BGR2GRAY)  faces = face_cascade. detectNu1tiSca1e(gray, 1.3, S)  , Sl'geT$IEJ detectM  for in faces:  cv2. rectangle( img,  roi_gray = x:x+wl  roi_color = x:x+b'l
    在这里,我们找到了面部,它们的大小,绘制矩形,并注意 ROI。 接下来,我们找了一些眼睛:
    eyes - eye_cascade.  for (ex, eh) in eyes:  cv2 . (ex,ey) , (ex.eu , ey•eh) , (e, 2SS, e) , 2)  cv2.imshow( img• ,img)  k cv2.waitKey(30) &
    完整代码:
    1  2  4  6  7  8  9  10  11  12  13 v  14  15  16  17  18 V  19  20  21  22  23  24  import numpy as np  import cv2  # multiple cascades: https://github.com/ltseez/opencv/tree/master/data/  haarcascades  #https://github.com/ltseez/opencv/blob/master/data/haarcascades/  haarcascade frontalface default.xml  face_cascade — cv2. CascadeC1assifier(  #https://github.com/ltseez/opencv/blob/master/data/haarcascades/  haarcascade_eye. xm1  eye_cascade — cv2. CascadeC1assifier( 'haarcascade_eye.xml • )  cap = cv2.VideoCapture(Ø)  while 1:  ret, img = cap. read()  gray cv2. cvtC010r(img, cv2. COLOR_3GR2GRAY)  faces • face_cascade. detectMu1tiSca1e(gray, 1.3, 5)  for in faces:  cv2. rectangle(img, (x,y) , (x+w,y+h) , (255 0) , 2)  x:x+w\]  roi_gray —  x: x+w\]  roi color  _cascade.  eyes eye  for in eyes:
    25  26  27  28  29  30  31  32  cv2. , (ex, ey) , (ex+ew, ey+eh) , (e, 255 , 0) , 2)  cv2. imshow( img• ,img)  k — cv2.waitKey(3Ø) & exff  if k  27:  break  cap. release()  cv2. dest
    不 谄 · 你 可 能 会 注 意 到 我 不 得 不 取 下 我 的 眼 潢 。 这 些 造 成 了 一 些 麻 烦 。 我 的 蓊 也 经 常 被 检 测 为  眼 , 有 时 至 是 一 张 脸 , 但 你 明 白 了 。 面 部 毛 发 和 其 他 西 经 常 可 以 欺 睚 基 不 面 部 检 测 , 除 此  之 外 , 皮 肤 的 颜 色 也 会 造 成 很 大 的 麻 烦 , 因 为 我 们 经 常 试 尽 可 能 筒 化 像 , 从 而 失 去 了 很 多 颜  色 值 。 甚 至 还 有 一 个 小 型 行 业 , 可 以 避 免 人 脸 识 别 。 CVDa e 网 站 就 是 一 个 例 子 。 其 中 有  些 非 常 古 怪 , 但 他 们 很 有 效 。 你 也 可 以 总 是 走 完 整 的 面 部 重 建 手 才 的 路 线 , 以 避 免 自 动 跟 踪 和 检  测 , 所 [ 以 总 是 泫 样 , 但 是 汶 更 永 久 . 做 个 发 型 比 较 短 暫 也 容 易 做 到 。  好 吧 , 检 面 部 , 眼 瞄 和 汽 车 是 可 以 的 孬 但 我 们 是 程 序 员 。 我 们 希 望 能 够 做 飪 何 事 情 。 事 实 证  明 , 事 情 会 变 得 相 当 混 乱 , 建 立 自 己 ajHaarCascades 有 一定 的 难 奩 , 但 是 他 人 也 这 么 放  你 也 可 以 ! 这 就 是 在 下 一 个 教 程 中 所 讨 论 的 ·  十 七 、 创 建 自 己 的 Haar cascade  欢 迎 使 用 thonOpenCV 对 象 橙 测 教 程 。 在 不 教 程 中 寺 看 到 如 何 创 建 你 自 己 的 HaarCasc  ades, 以 便 你 可 以 跟 踪 任 何 你 想 要 的 对 象 . 由 于 这 ' 个 任 务 的 质 和 复 杂 生 , 朩 教 程 将 比 平 时 怕 长  一 些 。 但 奖 励 是 巨 大 的 。  虽 然 你 可 以 在 Wind 。 ws 中 完 成 , 我 不 会 建 议 这 样 。 因 此 , 对 于 不 教 程 , 我 将 使 LinuxVPS  , 并 且 我 建 议 你 也 汶 样 做 。 你 可 以 尝 试 使 用 Am 雒 onWebServices 提 供 的 免 套 , 但 对 你 来 说  可 能 太 癤 苦 了 , 你 可 能 需 要 更 多 的 内 存 。 你 还 可 以 从 Digi ean 获 得 低 至 五 美 元 月 的 VPS 。  我 荐 至 少 2GB 的 内 存 用 于 我 们 将 要 做 的 事 情 。 现 旺 大 多 数 主 机 小 时 收 费 , 包 括 DO 。 因 此 .  你 可 以 祠 买 一 个 20 美 地 月 的 服 务 器 , 使 用 它 一 天 , 获 取 你 想 要 的 文 件 , 然 后 终 止 服 务 器 。 并 支  付 很 少 的 钱 。 你 需 要 更 多 的 帮 助 来 设 服 务 器 ? 如 果 是 的 话 , 看 看 泫 个 具 体 的 教 程 。  一 旦 你 的 服 务 器 准 备 就 绪 , 你 会 打 获 取 实 际 的 OpenCV 库 。  将 目 录 更 改 到 服 务 器 的 根 目 录 , 或 者 你 放 首 工 作 区 的 地 方 :](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639544535642-71860a8a-23e5-4628-83c2-5ff56181b836.jpg)<br />![1  2  3  4  5  cd  sudo apt-get update  sudo apt-get upgrade](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639544535754-285cd456-db16-4467-8cb1-8faca8e677a8.jpg)<br />![mkdir opencv_uorkspace  cd opencv_workspace  , opencv.  sud0 apt-get install git  git clone https://github.com/ltseez/opencv.git  opencv  : sudo apt-get install build-essential  : sudo apt-get install cmake eit Iibgtk2 pkg-config libavcodec-dev libavfo  ](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639544535850-c02383c5-48b9-4cad-8f90-0b389a965dd7.jpg)<br />![现 在 , 我 们 该 如 何 完 成 这 个 过 程 呢 ? 所 以 当 你 想 建 立 一 个 aarCascade 时 , 你 需 要 . 正 岸 图 像  和 “ 底 片 · 图 像 。 “ 正 岸 图 像 是 包 含 要 找 的 对 象 的 图 像 。 这 可 以 是 具 有 对 象 的 主 要 图 像 , 也 可 以 是  包 含 对 象 的 图 像 , 并 指 定 对 象 所 在 的 ROI ( 兴 趣 区 域 ) . 有 了 这 些 正 片 图 像 , 我 们 建 立 一 个 矢 量  文 件 , 慕 不 上 是 所 有 这 些 东 匹 放 在 一 起 。 正 片 像 的 一 价 处 是 , 你 可 以 实 际 只 有 一 个 你 想 要 险  测 的 对 象 的 图 像 , 然 后 有 几 干 个 底 片 0 像 。 是 的 , 几 干 。 底 片 图 像 可 以 是 任 何 东 西 , 除 了 他 们 不  能 包 含 你 的 对 象 .  在 这 里 , 使 闱 你 的 底 片 图 像 , 你 可 以 使 用 opencv_createsamples 命 令 来 创 建 一 堆 正 片 的 示 例  . 你 的 正 片 图 像 将 加 在 汶 些 底 片 上 , 而 且 会 形 成 各 种 售 样 的 角 应 。 它 实 际 上 可 以 工 作 得 很 好  特 别 是 如 果 你 只 是 任 尋 找 一 个 特 定 的 对 象 。 但 是 , 如 果 你 正 任 尋 找 所 有 螺 刀 , 则 要 麂 有 数 干  个 螺 丝 刀 的 独 特 图 像 , 而 不 是 使 用 opencv_createsamples 为 你 生 成 样 品 . 我 们 将 保 扌 寺 简 单 , 只  使 用 一 个 正 片 像 。 然 后 用 我 们 的 底 片 创 建 一 堆 样 朩 。  我 们 的 正 片 蟲 像](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639544535945-405912fa-1e91-44c4-a39f-ce12b7739978.jpg)<br />![这 是 另 外 一 个 场 景 , 如 果 你 使 用 自 己 的 像 , 你 可 能 会 更 喜 欢 这 个 。 如 果 事 情 出 宿 了 , 试 试 看  我 的 , 但 是 我 建 议 你 自 己 画 一 下 。 保 持 较 小 。 50x50 像 素 应 该 可 以 。  好 吧 庸 获 得 正 片 冬 像 是 没 有 问 题 的 ! 只 有 一 个 问 题 。 我 们 霈 要 成 手 上 万 的 底 片 图 像 。 可 能 在 耒  来 , 我 们 也 可 能 需 要 成 干 上 万 的 正 片 图 像 。 我 们 可 以 在 世 界 的 哪 个 地 方 实 现 它 ? 基 于 WordNet 的  概 念 , 有 一 个 非 常 有 用 的 站 焦 叫 做 ImageNet. 从 这 里 , 你 可 以 找 到 几 乎 任 何 东 西 的 图 像 。 我 们 这  里 , 我 们 想 要 手 表 , 所 以 瞍 索 手 表 孬 你 会 发 现 大 量 种 类 的 手 表 。 让 我 们 索 电 子 表 。 真 ! 看 看  下 载 标 签 ! 存 在 用 于 所 有 电 子 表 手 表 的 URL ! 很 酷 。 好 吧 , 但 我 说 过 我 们 只 会 使 用 一 个 正 片 , 所  以 我 们 只 是 检 测 一 个 手 表 . 如 果 你 想 检 耵 全 部 。 于 , 要 准 备 获 取 多 余 50 , 000 个 于 像 , 至  少 250 開 个 厩 片 》 的 到 像 。 之 后 》 准 足 够 的 服 务 器 , 除非 你 想 要 你 的 HaarCascadeiJllfiæ—  个 星 期 。 那 么 我 们 如 何 得 到 底 片 ? ImageNet 的 全 部 重 点 是 像 训 练 , 所 以 他 们 的 像 非 常 具 体  。 因 此 , 如 果 我 们 瞍 索 人 , 氵 气 车 , 船 只 , 飞 机 无 论 什 么 , 都 不 会 有 手 表 。 你 可 能 会 看 到 一 些 人  或 鲞 似 的 东 西 , 但 你 明 了 。 既 然 你 可 能 看 到 人 周 围 或 上 面 的 手 表 , 我 其 实 认 为 你 也 会 得 到 丿 、 . 的  图 像 。 我 的 想 氵 去 是 寻 找 做 运 动 的 人 , 他 们 可 能 没 有 电 孑 表 。 所 以 , 我 们 来 找 一 些 批 量 片 的 UR  L 链 接 。 我 发 现 体 育 / 出 径 链 接 1 , 888 张 图 片 , 但 你 会 发 现 很 多 这 些 都 是 完 全 损 坏 的 。 让 我 们 再  好 吧 , 我 们 拥 有 所 有 这 些 片 , 现 在 呢 ? 那 么 。 首 先 , 我 们 希 望 所 有 这 些 大 小 都 相 同 , 而 且 要  小 很 多 ! 天 哪 , 只 要 我 们 知 道 一 个 方 法 来 操 作 图 像 “ 哦 , 汶 是 一 个 OpenCV 教 程 ! 我 们 可 以  处 理 它 。 所 以 , 首 先 , 我 们 要 做 的 就 是 写 一 个 简 单 的 脚 朩 , 访 问 这 些 URL 列 表 , 获 取 链 , 访  问 链 接 , 拉 取 图 像 , 调 整 大 小 , 保 存 它 们 , 然 后 重 过 , 直 到 完 成 。 当 我 们 的 目 录 充 满 像 时 , 我  们 还 斐 要 一 种 描 还 像 的 庙 述 文 件 。 对 于 正 片 , 手 动 创 建 这 个 文 件 特 别 扁 苦 , 因 为 你 # 要 指 定 你  的 对 象 , 每 个 图 像 的 具 体 的 兴 趣 区 域 。 幸 运 的 是 , create_samples 方 法 将 像 随 机 放 置 , 并 为  我 们 做 了 所 有 工 作 。 我 们 只 要 一 个 用 于 底 片 的 简 单 描 述 符 , 但 是 这 不 是 司 题 , 在 拉 伸 和 操 作  像 的 我 们 可 以 实 现 。](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639544536047-79a92698-048c-45eb-83d7-a064fac4d393.jpg)<br />![在 任 何 你 喜 欢 的 地 方 随 意 运 行 汶 个 代 码 。 我 要 在 我 的 主 机 上 运 行 它 , 因 为 它 应 该 快 一 熏 。 你 可  以 旺 你 的 服 务 器 上 运 行 。 如 果 你 患 使 厍 cv2 模 块 。 谲 执 行 sudo apt-get install python-open  CV . 昼 前 , 我 不 知 道 在 L 血 以 上 为 Py 山 0n3 获 得 汶 些 绑 定 《 並 子 方 氵 去 。 我 将 要 写 的 不 是 p 贝 ho  n3 , 所 以 记 住 这 一 焦 。 主 要 区 别 是 urllib 处 理 。](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639544536173-8a1d49a6-5a29-4865-a2e3-511e97793141.jpg)<br />![2  4  6  7  11  12  13  14  15  16 v  17 v  18  19  2e  21  22  23  24  25  # download-image-by-link. py  import urllib. request  import cv2  import numpy as np  import os  def store_raw_images():  '/linage-net.org/api/text/  imagenet. synset. geturls •  • request. . read() .decode()  pic_num = 1  if not  os .makedirs( • neg )  for i in • \n•):  try :  print(i)  urllib. request. urlretrieve(i,  jpg](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639544536267-21079933-f71b-42f9-a0d4-05ca6f0cf629.jpg)<br />![26  27  except Exception as e:](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639544536364-5d578b51-6574-4e2d-b589-72621ea99164.jpg)<br />![很 简 单 , 这 个 脚 不 将 访 问 链 接 , 抓 取 网 址 , 并 继 续 访 问 它 们 。 从 这 里 , 我 们 抓 取 像 , 成  灰 , 诓 整 大 小 . 然 后 保 存 。 我 们 使 用 一 个 简 单 的 计 数 器 来 命 名 图 像 . 继 运 行 它 。 你 可 能 看 到  , 有 很 多 确 实 的 片 等 。 没 关 系 。 这 些 宿 误 图 片 中 的 一 些 更 有 问 题 。 基 不 上 都 是 臼 色 , 带 有 一 些  文 朩 , 说 他 们 不 再 可 用 , 而 不 是 服 务 和 HTTP 谄 误 。 现 任 , 我 们 有 几 个 选 怿 。 我 们 可 以 忽 略 它 们  , 或 者 修 复 它 。 嘿 , 汶 是 一 个 没 有 手 丢 的 图 像 , 所 以 什 么 是 对 的 呢 ? 当 然 , 你 可 以 采 取 这 种 观 点  但 如 果 你 为 正 片 使 用 汶 种 垃 取 方 式 的 话 , 这 醬 定 是 一 个 问 题 。 你 可 以 手 动 删 除 它 们 · 或 者 我 们 可  以 使 用 找 们 新 的 图 像 分 析 知 识 , 来 崆 毖 些 愚 的 像 , 并 将 其 剂 除 !  我 继 续 生 成 了 一 个 新 的 目 录 , 称 之 为 “ uglies ( 丑 陋 ) ](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639544536454-5939d0c4-a70e-46a2-92ea-a6bf039ab8d8.jpg)<br />![1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  def  match False  for file_type in ['neg•]:  for img in  for ugly in os.listdir( •uglies•):  try:  — / '+str(img)  ugly = cv2. imread( •uglies/'+str(ugly))  question — cv2. imread  if ugly. shape question. shape and not(np.  ugly, question) . any ( ) )  print( • That is one ugly pic! Deleting! • )  print(current_image_path)  os. remove (current_image_path)  except Exception as e:
    现 在 我 们 只 有 底 片 , 但 是 我 留 下 了 空 间 让 你 轻 易 在 那 里 添 加 •pos' ( 正 片 ) 。 你 可 以 运 行 它 来  测 试 , 但 不 介 意 先 抓 僅 更 多 的 底 胤 让 我 们 再 次 运 行 图 片 提 取 器 , 仅 仅 使 用 这 个 丽 : //imag  e-net .01 、 g/api/text/imagenet .synset .getut 、 Is?“n1d:n翎g42152 。 最 一 一 弓 长 亻 象 是 # 952 所  以 让 我 们 以 g53 开 始 pic_num , 并 生 改 网 址 。
    def  4  6  7  8  10 v  11  13  14  16  18  19  20  store_raw_images ( ) :  '//image-net.org/api/text/  imagenet. synset. geturls ?wnid=ne7942152 •  request. decode()  pic_num = 953  if not  os. makedirs( • neg• )  for i in  try:  print(i)  urllib. request.
    见 在 我 们 有 超 过 2 開 0 张 照 片 。 后 一 步 是 , 我 们 要 为 汶 些 底 片 图 像 创 建 描 述 符 文 件 。 我 有  穴 使 用 一 些 代 码 !
    def  5  7  8  9  11  12  13  c reate_pos _n_n eg ( )  for file_type in [ •neg']:  for img in .  if file_type  pos  line = file_type+'/  '+img+' 1 ØØ 5B 5Ø\n•  with open('info.dat•, 'a • ) as f:  f. write(line)  elif file_type  neg••  line =  with as f:  f. write(line)
    运 行 它 , 你 有 了 个 bg•txt 文 件 。 现 在 , 我 知 i 首 有 些 人 的 互 联 网 连 接 可 能 不 是 号 好 的 , 所 以 我  做 个 好 人 , 在 这 里 上 传 底 片 片 和 描 述 文 件 。 你 应 该 过 这 些 步 骤 。 如 果 你 对 不 教 感 到 困 扰 的  则 需 要 知 道 如 何 执 行 这 部 分 · 好 吧 , 所 以 我 们 决 定 我 们 将 一 个 图 像 用 于 正 片 前 景 图 因 此 , 我  们 需 要 执 行 create_samples . 这 意 味 看 , 我 们 需 要 将 我 们 的 neg 巨 录 和 bg. txt 文 件 移 动 到  我 们 的 服 务 如 果 你 在 服 器 上 运 行 所 有 汶 些 代 码 . 不 要 心 。
    , Windows , !  openc v_nrkspace  - -neg  - -nee images •  opencv  info  - -be.txt  - .jpg  info , mkdir in-fo .
    opencv_createsamples -img watch5050.jpg -bg bg.txt -info info/info.lst -pngoutput info -maxxangle 0.5 -maxyangle 0.5 -maxzangle 0.5 -num 1950
    这 样 做 是 基 于 我 们 指 定 的 地 创 建 样 不 , be 是 背 景 信 息 , 我 们 将 出 info.list 〔 很 像 b  g•txt 文 件 ) 的 亻 g 思 , 然 后 -pngoutput*i 是 我 们 要 放 新 生 成 的 图 像 的 任 何 地 方 。 最 后 , 我  们 有 一 些 可 选 的 参 数 , 使 我 们 的 原 像 更 昶 动 态 一 些 , 然 用 ; num 来 表 小 我 们 想 要 创 建 的 样  才 数 是 . 太 棒 了 讠 上 我 们 来 运 行 它 . 现 在 info 目 应 该 有 约 2 , 0 个 图 像 , 还 有 一 个 名 为  info.lst 的 文 件 。 这 个 文 件 基 本 上 是 你 的 “ 正 片
    1  2  6  7  8  opencv_workspace  - -neg  -neglmages. J pg  - -opencv  -info  -data  -positives. vec  -watch5Ø5Ø. Jpg  - bg. txt
    现在让我们运行训练命令:
    opencv_traincascade -data data -vec positives.vec -bg bg.txt -numPos 1800 -numNeg 900 -numStages 10 -w 20 -h 20
    在这里,我们表明了,我们想要数据去的地方,矢量文件的位置,背景文件的位置,要使用多少个正片图像和底片图像,多少个阶段以及宽度和高度。请注意,我们使用的 numPos比我们少得多。这是为了给阶段腾出空间。
    有 更 多 的 选 择 , 但 这 些 就 够 了 。 这 里 主 要 是 正 片 和 底 片 的 数 量 。 一 般 认 为 , 对 于 大 多 数 实 践 ,  你 雩 要 2 · 1 比 例 的 正 片 和 底 片 图 像 · 有 彐 况 可 能 会 有 所 不 同 , 但 这 是 人 们 似 手 遵 的 一 般 规 则  。 接 下 来 , 我 们 樨 有 阶 段 . 我 们 选 择 了 10 个 。 你 至 少 要 1 20 个 , 越 多 需 要 的 时 间 越 长 , 而 且 是  指 数 级 的 。 第 一 阶 段 通 常 很 快 , 第 五 阶 段 要 得 多 , 第 五 十 个 阶 段 永 远 不 会 做 完 ! 所 以 , 我 们 现  在 执 行 10 个 阶 段 。 这 里 不 谄 的 事 情 是 你 可 以 训 繇 10 个 阶 段 , 秸 后 再 回 来 , 把 数 字 成 20 , 然 后  你 离 开 的 地 方 继 续 。 同 样 的 , 你 也 可 以 放 一 些 像 100 个 阶 段 的 东 西 , 上 睡 觉 , 早 上 醒 来 , 停  下 来 , 看 看 你 有 多 远 , 然 后 用 汶 些 阶 段 练 0 你 会 立 即 得 到 一 个 层 文 件 . 你 可 能 从 最 后 一 句 话  中 得 出 , 这 个 命 令 的 结 果 晦 实 很 陸 , 是 个 不 的 层 臨 文 件 。 我 们 希 望 能 检 测 到 我 的 羊 表 , 或 者 你  决 定 检 测 的 任 何 乐 西 。 我 所 知 盾 的 是 , 在 输 出 汶 一 殿 的 时 候 , 我 还 沿 有 完 成 第 一 阶 鰻 的 工 作 。 如  果 你 真 的 想 要 在 一 夜 之 间 运 行 命 令 。 但 不 想 让 终 端 打 开 , 你 可 以 使 用 nohup  nohup opencv traincascade -data data -vec positives . vec -b: bg . txt -numpos 1880 -num
    在 我 的 2G 日 DO 服 务 器 上 , 10 个 阶 殷 花 了 不 到 2 个 小 时 的 时 间 。 所 以 , 要 么 有 一 个 cascade  xml 文 件 , 要 么 停 止 朩 运 行 。 如 果 你 停 止 运 行 , 你 应 该 你 的 data 目 录 下 有 一 堆 stagex.x  ml 文 件 。 打 开 它 , 看 看 你 有 多 少 个 阶 段 , 然 后 你 可 以 使 用 这 些 阶 設 , 再 次 运 行 opencv_trainca  scade , 你 会 立 即 得 到 一 个 cascade.xmu 文 件 。 这 里 , 我 只 想 说 出 它 是 什 么 , 以 及 有 多 少 个 阶  段 。 对 我 来 说 , 我 做 了 10 个 阶 段 , 所 以 我 将 它 市 命 名 为 watchcascadelestage.xml 。 汶 就 是 我  们 所 需 的 , 所 以 现 在 将 新 的 层 次 文 件 传 回 主 计 机 , 放 在 工 作 目 录 中 , 让 我 们 试 试 看 !
    4  11  12  13  14  15  16  17  18  19  2e  21  22  23  24  25  26  27  import numpy as np  import cv2  face_cascade • cv2. )  eye_cascade — cv2.CascadeC1assifier( •haarcascade_eye.xml•)  #this is the cascade we just made. Call what you want  watch_cascade cv2.CascadeC1assifier( •watchcascade1Østage.xm1• )  cap • cv2. VideoCapture(Ø)  while 1:  ret, img = cap. read()  gray = cv2. cvtColor(img, cv2. COLOR_BGR2GRAY)  faces face_cascade. 1.3, 5)  # add this  # image, reject levels level weights.  watches = watch_cascade. detectMu1tiSca1e(gray, 50, 50)  # add this  for in watches:  cv2. rectangle(img, (x,y) , (x+w,y+h) , (255, 255, 0) , 2)  for in faces:  cv2. rectangle(img, (x,y) , (x+w,y+h) , (255, e, e) , 2)
    28  29  30  31  32  33  34  35  36  37  38  39  40  roi_gray = gray[y:y+h, x: x+w]  roi_color = x:x+w]  eye_c a s c a de. detect-Mu ItiSc ale ( roi_gray )  eyes  for in eyes:  cv2. (ex, ey) , (ex+ew, ey+eh) , (0, 255 , 0) , 2)  cv2. imshow( img• , img)  k = cv2.waitKey(3Ø) & Øxff  if k  27:  break  . release ( )  cap  destroyA11Windows ( )  cv2.
    你 可 抬 意 到 手 表 的 方 框 很 小 。 它 似 乎 并 没 有 达 到 整 个 手 表 。 回 想 一 下 我 们 的 训 练 规 模 是 2  20 。 因 此 , 我 们 多 有 个 四 x20 的 方 框 。 你 可 以 做 1 . 但 是 要 小 心 , 这 将 生 要 很  长 时 间 来 训 练 。 因 此 , 我 们 下 烩 制 方 框 , 而 是 , 为 什 么 不 在 表 上 写 字 或 什 么 东 西 ? 这 样 做 相 对  简 单 。 我 们 不 在 表 上 执 行 cv2 . rectangle(img,(x , y) , (:«w,Y+h), 但 , 0 , 255 ) , 2 ) 我 们 可 以 庚  行 :  font  cv2 . F 创 H E RSHEY SIMP L EX  cv2.putText(img,'Watch•.(x-w,y-h) ,  font,  e · 5 ,  ( 11 。 255 孬 255L  《 v2 . LINE_AA)
    很酷! 所以你可能没有使用我的手表,你是怎么做的? 如果遇到麻烦,请尝试使用与我完全相同的所有内容。 检测图像,而不是检测摄像头,这里是一个:
    我 不 了 解 你 。 但 一 旦 我 最 终 侵 其 工 作 , 痱 丰 常 兴 奋 ! 让 我 印 象 深 刻 的 是 , 跟 踪 对 厮 凳 的 数  据 大 小 。 Haar Cascades 往 往 是 100 . 2000 KB 的 大 小 · 大 于 等 于 2 000 KB 的 Haar Cascades 应  该 非 常 准 确 。 考 仂 ; 情 况 , 你 可 能 会 遇 到 约 5000 个 一 般 物 · 考 虑 Haar Cascades 平 均 可 能  是 约 500KB 。 我 们 霈 要 : 伍 5 朋 “ 5 , e “ · 2 , 5 或 25GB 。 你 要 25GB 的 内 存 来 识  别 5 開 0 个 对 象 , 并 且 可 能 是 你 在 一 天 中 遇 到 的 最 多 对 象 。 这 让 我 萏 迷 。 考 虑 到 我 们 可 以 访 问 所 有  的 image-net . 共 可 以 立 即 拉 取 很 大 范 围 的 对 象 的 一 般 图 像 。 考 虑 mage-net 上 的 大 多 数 图 像 , 基  不 上 都 是 1 開 % 酊 跟 淙 对 象 , 因 此 , 你 可 以 涵 过 手 动 标 氵 彐 立 置 , 并 仅 使 用 0 囤 和 图 像 的 全 部 大 小  来 得 到 正 确 的 结 果 。 这 里 你 可 以 做 的 事 情 有 巨 大 能 好 吧 , 那 就 是 现 在 。 拢 来 可 能 会 用 Open  CV 做 一 些 字 符 识 别 . 如 果 你 有 任 何 其 他 要 求 , 发 送 电 孑 邮 件 , 在 社 区 中 提 出 窪 议 , 或 张 贴 在 视  享 受 你 的 新 力 。 好 好 利 用 它 们 。
    谢谢阅读!!!
    0penCV
    本文仅代表作者观点,不代表百度立场。本文系作者授权百家号发表,未经许可,不得转载。
    已使用 Microsoft OneNote 2016 创建。