图像特征描述和人脸识别
CV_tutorial2
- 特征检测
- 使用HOG实现行人检测
- Harris角点检测
- 关键特征检测SIFT
- 纹理特征 LBP算法
- 模板匹配
- 人脸识别
特征检测
使用HOG实现行人检测
HOG方向梯度直方图
实现过程:
- 灰度化(为了去掉颜色、光照对形状的影响);
- 采用Gamma校正法对输入图像进行颜色空间的标准化(使得图像输入更符合肉眼看上去更加柔和的状态);
- 计算每个像素的梯度,包括方向和大小;
- 将图像划分成小cells;
- 统计每个cell的梯度直方图,得到cell的描述子;
- 将每几个cell组成一个block,得到block的描述子;
- 将图像image内的所有block的HOG特征descriptor串联起来就可以得到HOG特征,该特征向量就是用来目标检测或分类的特征。
import cv2
import numpy as np
# 判断矩形i是否完全包含在矩形o中
def is_inside(o, i):ox, oy, ow, oh = 0ix, iy, iw, ih = ireturn ox > ix and oy > iy and ox+ow < ix+iw and oy+oh < iy+ih# 对人体绘制颜色框
def draw_person(image, person):x, y, w, h = personcv2.rectangle(image, (x,y), (x+w, y+h), (0,0,255), 1)
img = cv2.imread("person.png")
hog = cv2.HOGDescriptor() # 启动检测器对象
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) # 指定检测器类型为人体
found, w = hog.detectMultiScale(img, 0.1, (1,1)) # 加载并检测对象
print(found)# 丢弃某些完全被其它矩形包含在内的矩形,即其他都加入队列里
found_filtered = []
for ri, r in enumerate(found):for qi, q in enumerate(found):if ri != qi and is_inside(r, q):breakelse:found_filtered.append(r)print(found_filtered)
# 对其他有效矩形进行框定
for person in person_filtered:draw_person(img, person)
cv2.imshow("person detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
行人检测结果:
换了其他图片,发现这是效果最好的一张☝️
Harris角点检测
实现过程:
- 计算图像在x和y方向的梯度
- 计算图像两个方向的梯度的乘积
- 使用高斯函数对三者进行高斯加权,生成矩阵M的A, B, C
- 计算每个像素的Harris响应值R,并对小于某一阈值t的R置为零
- 在3x3或5x5的邻域内进行非最大值抑制,局部最大值点即为图像的角点
import cv2
import numpy as np
img = cv2.imread("img.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray) # 转换成numpy矩阵# 输入图像必须是float32,blockSize,kernelsize,最后一个自由参数
#(经验取值在0.03~0.06之间)
dst = cv2.cornerHarris(gray, 2, 3, 0.03)# 设定角点阈值,不同图像阈值不同
# 将角点用红色标注
img[dst>0.01*dst.max()]=[0, 0, 255]
# print(dst.max()) # 533091900.0
cv2.imshow("dst_img",img)
cv2.waitKey(0)
cv2.destryAllWindows()
角点检测:
在原图上进行角点标注:
可以对角点进行膨胀,看得更清楚:dst = cv2.dilate(dst,None)
单纯使用Harris的话,稍微复杂一点检测效果不佳
关键特征检测SIFT
Scale-invariant feature transform, 尺度不变特征变换算法
实现过程:
- 尺度空间极值检测点检测
- 关键点定位:去除一些不好的特征点
- 关键点方向参数:获取关键点所在尺度空间的邻域,然后计算该区域的梯度和方向,根据计算结果创建方向直方图,直方图的峰值为主方向的参数
- 关键点描述:每个关键点用一组向量(位置、尺度、方向)将这个关键点描述出来,使其不随着光照、视角等等影响而改变【优势】
- 关键点匹配:分别对模板图和实时图建立关键点描述符集合,通过对比关键点描述符来判断两个关键点是否相同
OpenCV > 4.0受到专利限制移除了xfeatures2d
函数
import cv2
import numpy as np
img = cv2.imread("1.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray, None) # 找到关键点
img = cv2.drawKeypoints(gray, kp, img) # 绘制关键点cv2.imshow('sp', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
纹理特征 LBP算法
Local Binary Pattern, 局部二值模式
LBP算子定义在3X3的窗口内,以窗口中心为阈值,与相邻的8个像素的灰度值比较,若周围的像素值大于中心像素值,则该位置被标为1;否则标记为0。
def LBP(src):height = src.shape[0]width = src.shape[1]dst = src.copy() # 浅拷贝lbp_value = np.zeros((1, 8), dtype=np.uint8)neighbours = np.zeros((1, 8), dtype=np.uint8)for x in range(1, width-1):for y in range(1, height-1):neighbours[0, 0] = src[y - 1, x - 1]neighbours[0, 1] = src[y - 1, x]neighbours[0, 2] = src[y - 1, x + 1]neighbours[0, 3] = src[y, x - 1]neighbours[0, 4] = src[y, x + 1]neighbours[0, 5] = src[y + 1, x - 1]neighbours[0, 6] = src[y + 1, x]neighbours[0, 7] = src[y + 1, x + 1]center = src[y, x]for i in range(8):if neighbours[0, i] > center:lbp_value[0, i] = 1else:lbp_value[0, i] = 0# 计算lbp值(即二进制到十进制)lbp = lbp_value[0, 0] * 1 + lbp_value[0, 1] * 2 + lbp_value[0, 2] * 4 + lbp_value[0, 3] * 8 \+ lbp_value[0, 4] * 16 + lbp_value[0, 5] * 32 + lbp_value[0, 6] * 64 + lbp_value[0, 7] * 128# 将中心值改为lbp值dst[y, x] = lbpreturn dstimport cv2
import numpy as np
img = cv2.imread('building.png', 0) # 以单通道读入图像
# 看下源图
cv2.imshow('src',img)
cv2.waitKey(0)
cv2.destroyAllWindows()new_img = LBP(img)cv2.imshow('lbp',new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
模板匹配
人脸识别
一个完整的人脸识别系统一般包含4个主要组成部分:
- 人脸检测(人脸位置)
Face Detect
- 人脸对齐(五官位置)
Face Alignment
- 人脸特征提取(抽象为字符串信息)
Face Feature Extraction
- 人脸识别(计算相似度,确认身份)
Face Recognition
- OpenCV封装的人脸检测方法
import cv2img = cv2.imread("1.png")
# 检测器,加载人脸特征(该文件在python安装目录下)
face_cascade = cv2.CascadeClassifier(r'haaracascade_frontalface_default.xml')
# 灰度图减少计算强度(避免颜色干扰)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 检测的一个人脸坐标[x,y,w,h]是一个list,所以list的数量就是人脸数量
faces = face_cascade.detectMultiScale(gray, scaleFactor = 1.15, minNeighbors = 4, minSize = (5, 5))
print("Faces:{0}".format(len(faces)))# 用矩形圈出人脸的位置(提供左上角和右下角坐标)
for(x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)cv2.imshow("Faces", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Face : 1
通过其他照片的试验,OpenCV自带的方法和dilb对于标准正脸检测OK的,但是对于侧脸(不同角度)以及低像素基本完全不OK
- 使用dlib中的方法
# -*- coding:utf-8 -*-
import cv2
import dlib
import numpy as nppredictor_model = 'shape_predictor_68_face_landmarks/shape_predictor_68_face_landmarks.dat'
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_model)
dlib库没办法直接pip安装
找python3.8对应的dlib的轮子找了好一会儿,放百度盘了需要自取
许多博客尤其是
CSDN,免费开源的放自己文章里收费😅,很不友好,目前还是习惯在这里记一些流水帐笔记😞
相关文章:

图像特征描述和人脸识别
CV_tutorial2 特征检测使用HOG实现行人检测Harris角点检测关键特征检测SIFT纹理特征 LBP算法 模板匹配人脸识别 特征检测 使用HOG实现行人检测 HOG方向梯度直方图 实现过程: 灰度化(为了去掉颜色、光照对形状的影响);采用Gamma校正法对输…...

浅谈Lua协程和函数的尾调用
前言 虽然不经常用到协程,但是也不能谈虎色变。同时,在有些场景,协程会起到一种不可比拟的作用。所以,了解它,对于一些功能,也会有独特的思路和想法。 协程 概念 关于进程和线程的概念就不多说。 那么…...

【VS Code插件开发】状态栏(五)
🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋♂️ 作者简介:前端领域优质作者、阿里云专家博主,共同学习共同进步,一起加油呀! 📢 资料领取:前端…...

睿趣科技:抖音开网店要怎么找货源
在当今数字化的时代,电商平台的兴起为越来越多的人提供了开设网店的机会,而抖音作为一个充满活力的短视频平台,也为创业者提供了广阔的发展空间。然而,对于许多初次涉足电商领域的人来说,找到合适的货源却是一个重要的…...

表和Json的相互操作
目录 一、表转Json 1.使用 for json path 2.如何返回单个Json 3.如何给返回的Json增加一个根节点呢 4.如何给返回的Json增加上一个节点 二、对Json基本操作 1.判断给的字符串是否是Json格式 2.从 JSON 字符串中提取标量值 3. 从 JSON 字符串中提取对象或数组 4. 更…...

每日后端面试5题 第八天
1.UDP和TCP协议的区别 1.UDP无连接,速度快,安全性低,适合高速传输、实时广播通信等。 2.TCP面向连接,速度慢,安全性高,适合传输质量要求高、大文件等的传输,比如邮件发送等。 (还…...
mysql数据库和数据表
常用的数据类型: int : 整型 用于定义整数类型的数据float : 单精度浮点4字节32位 准确表示到小数点后六位.double :双精度浮点8字节64位char :固定长度的字符类型 用于定义字符类型数据varchar :可变长度的字符类…...

MySQL执行更新的流程
一、加载缓存数据 引擎要执行更新语句的时候 ,比如对“id10”这一行数据,他其实会先将“id10”这一行数据看看是否在缓冲池里,如果不在的话,那么会直接从磁盘里加载到缓冲池里来,而且接着还会对这行记录加独占锁。 二…...
要获取 PHP 中当前时间的前一天、本周、本月、本季度和本年,可以使用 PHP 的内置日期和时间函数。
要获取 PHP 中当前时间的前一天、本周、本月、本季度和本年,可以使用 PHP 的内置日期和时间函数。下面是一些示例代码来帮助你实现这些功能: php // 获取当前时间的前一天 $yesterday date(Y-m-d, strtotime(-1 day));// 获取本周的开始日期和结束日期…...

java八股文面试[java基础]——如何实现不可变的类
知识来源: 【23版面试突击】如何实现不可变的类?_哔哩哔哩_bilibili 【2023年面试】怎样声明一个类不会被继承,什么场景下会用_哔哩哔哩_bilibili...

juc基础(四)
目录 一、ThreadPool 线程池 1、参数说明 2、拒绝策略 3、线程池种类 (1)newCachedThreadPool(常用) (2)newFixedThreadPool(常用) (3)newSingleThreadExecutor(常用) (4)ne…...
C++智能指针weak_ptr的作用
当使用std::shared_ptr时,循环引用可能会导致资源泄漏的问题。下面是一个简单的示例,展示了循环引用导致资源泄漏的情况: #include <iostream> #include <memory>class A; class B;class A { public:std::shared_ptr<B> b…...
lintcode 344 · 歌曲时间【背包问题,动态规划】
题目链接,描述 https://www.lintcode.com/problem/344/ 给定长度为N的正整数数组song代表N首歌的时间 请你任选其中若干首播放,在满足开始播放最后一首歌的时间小于M的情况下求播放歌曲的最长时间 每首歌只能被播放一次 你可以任意指定播放顺序1 \leq …...

Qt应用开发(基础篇)——对话框窗口 QDialog
一、前言 QDialog类继承于QWidget,是Qt基于对话框窗口(消息窗口QMessageBox、颜色选择窗口QColorDialog、文件选择窗口QFileDialog等)的基类。 QDialog窗口是顶级的窗口,一般情况下,用来当做用户短期任务(确认、输入、选择)或者和用户交流(提…...

Linux系统:CentOS 7 CA证书服务器部署
目录 一、理论 1.CA认证中心 2.CA证书服务器部署 二、实验 1. CA证书服务器部署 三、总结 一、理论 1.CA认证中心 (1)概念 CA :CertificateAuthority的缩写,通常翻译成认证权威或者认证中心,主要用途是为用户…...

C++图形界面编程-MFC
C控制台程序是命令行黑框,如果要写一个图形界面,VS也提供了图形界面编程MFC。建项目的时候选如下选项: 类似于QT。 问:那么MFC项目的运行入口main()或WinMain()在哪里呢? 答:其实,在MFC应用程…...
知识扩展贴 圆越大,其圆接触的无知面就越多
CSDN 排行榜 https://blog.csdn.net/rank/list/total?spm1001.2014.3001.5476 顺其自然~_-CSDN博客...

怎么把pdf转换成jpg格式?
怎么把pdf转换成jpg格式?在我们日常的办公过程中,PDF文件是一个经常被使用来传输文件的格式。它能够确保我们的文件内容不会混乱,并以更加完美的方式呈现出来。然而,PDF文件也存在一些缺陷。例如,它无法直接编辑&#…...

Android SDK 上手指南||第六章 用户交互
第六章 用户交互 在这篇教程中,我们将对之前所添加的Button元素进行设置以实现对用户点击的检测与响应。为了达成这一目标,我们需要在应用程序的主 Activity类中略微涉及Java编程内容。如果大家在Java开发方面的经验不太丰富也没必要担心,只…...

Vue3+Pinia+Koa+Three.js 全栈电商项目总结复盘
前言 前几天一个朋友去义乌旅游,带回来很多小商品,就是一整个物美价廉,但是为什么线下购物和网购有的时候差别这么大(网购经常要退换货啊😭😭😭),为此我萌生了一个想法&…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

表单设计器拖拽对象时添加属性
背景:因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...