当前位置: 首页 > news >正文

基于 Open_CV 模板匹配的简易微笑识别

要求:读取数张人脸图像,对面部进行识别,当人脸出现微笑表情时,指示框编程蓝色,如下图所示。

我做的就是应用一下刚学的  Open_CV 中模板匹配的方法,用模板匹配的方法来识别已经处理的图片中,是否微笑。而没有用神经网络来对没有处理的图片识别。

首先截取了现有图片的中的一部分,图片处理如下:

程序如下:

# -*- coding: utf-8 -*-

import cv2
import sys

def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


img1 = cv2.imread('n_smile.jpg')
img2 = cv2.imread('smile.jpg')

img_normal = cv2.imread('n_smile.jpg', 0)
template_normal = cv2.imread('n_smile_template.png', 0)
h_normal, w_normal = template_normal.shape[:2]

img_smile = cv2.imread('smile.jpg', 0)
template_smile = cv2.imread('smile_template.png', 0)
h_smile, w_smile = template_smile.shape[:2]

pd = True
while pd:
    img = input("请输入图片:")

    if img == 'q':
        pd = False
        sys.exit()

    img = cv2.imread(img)

    if (img == img1).all():
        res = cv2.matchTemplate(img_normal, template_normal, cv2.TM_SQDIFF_NORMED)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

        top_right = min_loc
        bottom_right = (top_right[0] + w_normal, top_right[1] + h_normal)

        cv2.rectangle(img1, top_right, bottom_right, (0, 0, 255), 8)

        cv_show('img', img1)
    elif (img == img2).all():
        res = cv2.matchTemplate(img_smile, template_smile, cv2.TM_SQDIFF_NORMED)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

        top_right = min_loc
        bottom_right = (top_right[0] + w_smile, top_right[1] + h_smile)

        cv2.rectangle(img2, top_right, bottom_right, (255, 0, 0), 8)

        cv_show('img', img2)

微笑时的图片传入,用蓝色的框将表情框住,结果展示:

 正常的表情传入时,用红色的框将表情框住,结果展示:

这只是我在学习 Open_CV 中的一个小想法,如果想要预测大量的图片,大家可以写一个list 来存储图片,通过循环来遍历。判断笑脸位置。

对于想要判断任意图片,大家可用神经网络制作数据集,来训练网络。

相关文章:

  • 问题解决:VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences
  • 基于范型的java函数式编程(一)
  • 成功解决:TypeError: bad argument type for built-in operation
  • 成功解决:函数np.hstack()报错ValueError: all the input arrays must have same number of dimensions
  • 出关喽
  • 利用 tesseract 自动识别图片中的文字
  • t.k.x's ACM(1)---前言
  • Centos GUI界面和命令行界面的转化
  • 成功解决:yolov5 中 tensorboard 打不开
  • 电脑重启故障解析
  • 成功解决:AttributeError: Can‘t get attribute ‘SPPF‘ on <module ‘models.common‘ from ‘/data-output/yolov5
  • Windows操作系统“安全模式”的应用
  • 成功解决:wandb.errors.UsageError: api_key not configured (no-tty). call wandb.login(key=[your_api_key])
  • yolov5 的 test.py 报错: use ‘pytest --fixtures [testpath]‘ for help on them.
  • 表格背景渐变的实现
  • JavaScript-如何实现克隆(clone)函数
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [NodeJS] 关于Buffer
  • 【comparator, comparable】小总结
  • android 一些 utils
  • eclipse(luna)创建web工程
  • learning koa2.x
  • Redis 懒删除(lazy free)简史
  • vue.js框架原理浅析
  • 关于List、List?、ListObject的区别
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 一些css基础学习笔记
  • 《码出高效》学习笔记与书中错误记录
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (C语言)球球大作战
  • (Git) gitignore基础使用
  • (超详细)语音信号处理之特征提取
  • (第一天)包装对象、作用域、创建对象
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)甲方乙方——赵民谈找工作
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .Net Memory Profiler的使用举例
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET简谈设计模式之(单件模式)
  • .NET开源项目介绍及资源推荐:数据持久层
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • /proc/vmstat 详解
  • @EnableConfigurationProperties注解使用
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [C#7] 1.Tuples(元组)
  • [CF226E]Noble Knight's Path
  • [FxCop.设计规则]8. 也许参数类型应该是基类型