OPENCV C++(八)HOG的实现
hog适合做行人的识别和车辆识别 对一定区域的形状描述方法
可以表示较大的形状 把图像分成一个一个小的区域的直方图
用cell做单位做直方图
计算各个像素的梯度强度和方向
用3*3的像素组成一个cell 3*3的cell组成一个block来归一化 提高亮度不变性
常用SVM分类器一起使用 进行行人分类
代码思路:
将图像分成cell为单位 例如把图像分成9*9像素的cell为单位。用sobel计算梯度大小和方向。
遍历每一个cell,一个cell可以分8类,用角度当作数组的下标,也就是分类的依据,数组的大小也就是分类的一个类的大小就是梯度的大小相加。
计算两个图的直方图的直方图距离的大小累加值
计算hog直方图函数:
int calcHOG(cv::Mat src, float* hist, int nAngle, int cellSize)
{int nX = src.cols / cellSize;int nY = src.rows / cellSize;int binAngle = 360 / nAngle;Mat gx, gy;Mat mag, angle;Sobel(src, gx, CV_32F, 1, 0, 1);Sobel(src, gy, CV_32F, 0, 1, 1);cartToPolar(gx, gy, mag, angle, true);Rect roi;roi.x = 0;roi.y = 0;roi.width = cellSize;roi.height = cellSize;for (int i = 0; i < nY; i++) {for (int j = 0; j < nX; j++) {Mat roiMat;Mat roiMag;Mat roiAgl;roi.x = j * cellSize;roi.y = i * cellSize;//赋值图像roiMat = src(roi);roiMag = mag(roi);roiAgl = angle(roi);//当前cell第一个元素在数组中的位置int head = (i * nX + j) * nAngle;for (int n = 0; n < roiMat.rows; n++) {for (int m = 0; m < roiMat.cols; m++) {//计算角度在哪个bin,通过int自动取整实现int pos = (int)(roiAgl.at<float>(n, m) / binAngle);//以像素点的值为权重hist[head + pos] += roiMag.at<float>(n, m);}}}}return 0;}
mag梯度大小强度 angle是角度的mat
传入的参数就是:图像,直方图数组,分成几个angle类型(一般是8个),cell的大小。
计算两个直方图的距离
float normL2(float* Hist1, float* Hist2, int size)
{float sum = 0;for (int i = 0; i < size; i++) {sum += (Hist1[i] - Hist2[i]) * (Hist1[i] - Hist2[i]);}sum = sqrt(sum);return sum;
}
第一种是自己申明数组 然后做hog
Mat temple = imread("hogTemplate.jpg",0);Mat img1 = imread("img1.jpg",0);Mat img2 = imread("img2.jpg",0);float his[3000] = { 0 };float his1[3000] = { 0 };float his2[3000] = { 0 };printf("%d %d\r\n",temple.cols,temple.rows);calcHOG(temple, his, 8, 9);calcHOG(img1, his1, 8, 9);calcHOG(img2, his2, 8, 9);float summ = normL2(his, his1, 3000);float summ2 = normL2(his, his2, 3000);cout << summ <<"\r\n" << endl;cout << "------" << endl;cout << summ2 <<"\r\n" << endl;

用动态开辟内存数组来进行hog
int nX = refMat.cols / blockSize;int nY = refMat.rows / blockSize;int bins = nX * nY * nAngle;float* ref_hist = new float[bins];memset(ref_hist, 0, sizeof(float) * bins);float* pl_hist = new float[bins];memset(pl_hist, 0, sizeof(float) * bins);float* bg_hist = new float[bins];memset(bg_hist, 0, sizeof(float) * bins);
这是比较关键的代码 就是动态开辟一个内存
delete[] ref_hist;delete[] pl_hist;delete[] bg_hist;destroyAllWindows();
记得要释放内存!
完整代码:
cv::Mat refMat = imread("hogTemplate.jpg");cv::Mat plMat = imread("img1.jpg");cv::Mat bgMat = imread("img2.jpg");int nAngle = 8;int blockSize = 9;int nX = refMat.cols / blockSize;int nY = refMat.rows / blockSize;int bins = nX * nY * nAngle;float* ref_hist = new float[bins];memset(ref_hist, 0, sizeof(float) * bins);float* pl_hist = new float[bins];memset(pl_hist, 0, sizeof(float) * bins);float* bg_hist = new float[bins];memset(bg_hist, 0, sizeof(float) * bins);int reCode = 0;reCode = calcHOG(refMat, ref_hist, nAngle, blockSize);reCode = calcHOG(plMat, pl_hist, nAngle, blockSize);reCode = calcHOG(bgMat, bg_hist, nAngle, blockSize);float dis1 = normL2(ref_hist, pl_hist, bins);float dis2 = normL2(ref_hist, bg_hist, bins);std::cout << "distance between reference and img1:" << dis1 << std::endl;std::cout << "distance between reference and img2:" << dis2 << std::endl;(dis1 <= dis2) ? (std::cout << "img1 is similar" << std::endl) : (std::cout << "img2 is similar" << std::endl);delete[] ref_hist;delete[] pl_hist;delete[] bg_hist;destroyAllWindows();return 0;
}

有没有很疑惑 为啥两种计算的方式 他们hog值不一样?
因为第一种我把他灰度化了 所以值偏低,我们现在把第二种方法的也灰度化

ok 简直一摸一样 结束实验
相关文章:
OPENCV C++(八)HOG的实现
hog适合做行人的识别和车辆识别 对一定区域的形状描述方法 可以表示较大的形状 把图像分成一个一个小的区域的直方图 用cell做单位做直方图 计算各个像素的梯度强度和方向 用3*3的像素组成一个cell 3*3的cell组成一个block来归一化 提高亮度不变性 常用SVM分类器一起使用…...
干货分享:制作婚礼请柬的技巧,从零基础起步
在现代社会,婚礼请柬已经成为了婚礼必备的一部分。而如何制作一个个性化的婚礼请柬呢?今天,我们将分享一个简便而可靠的制作方法,那就是使用乔拓云平台。 乔拓云平台是一个可靠的第三方制作工具,提供了丰富的H5模板&am…...
c语言每日一练(6)
前言:每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情…...
2023年国赛数学建模思路 - 复盘:校园消费行为分析
文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…...
WebAPIs 第四天
1.日期对象 2.节点操作 3.M端事件 4.JS插件 一.日期对象 实例化时间对象方法时间戳 日期对象:用来表示时间的对象 作用:可以得到当前系统时间 1.1 实例化 ① 概念:在代码中发现了new关键字时,一般将这个操作称为实例化 …...
SQL 语句解析过程详解
SQL 语句解析过程详解: 1.输入SQL语句 2.词法分析------flex 使用词法分析器(由Flex生成)将 SQL 语句分解为一个个单词,这些单词被称为“标记“。标记包括关键字、标识符、运算符、分隔符等。 2.1 flex 原…...
单源最短路径【学习算法】
单源最短路径【学习算法】 前言版权推荐单源最短路径Java算法实现代码结果 带限制的单源最短路径1928. 规定时间内到达终点的最小花费LCP 35. 电动车游城市 最后 前言 2023-8-14 18:21:41 以下内容源自《【学习算法】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此…...
汽车上的电源模式详解
① 一般根据钥匙孔开关的位置来确定整车用电类别,汽车上电源可以分为常电,IG电,ACC电 1)常电。常电表示蓄电池和发电机输出直接供电,即使点火开关在OFF档时,也有电量供应。一般来讲模块的记忆电源及需要在车…...
【碎碎念随笔】1、回顾我的电脑和编程经历
✏️ 闲着无事,讲述一下我的计算机和代码故事 一、初识计算机 🖥️ 余家贫,耕植无钱买电脑。大约六年级暑假,我在姐姐哪儿第一次接触到了计算机(姐姐也是买的二手)。 🖥️ 计算机真有趣&#x…...
背上花里胡哨的书包准备面试之webpack篇(+一些常问的面试题)
目录 webpack理解? webpack构建流程? loader解决什么问题? plugin解决什么问题? 编写loader和plugin的思路? webpack热更新? 如何提高webpack的构建速度? 问git常用命令? ht…...
你知道什么是Curriculum Training模型吗
随着深度学习技术的飞速发展,研究人员在不断探索新的训练方法和策略,以提高模型的性能和泛化能力。其中,Curriculum Training(课程学习)模型作为一种前沿的训练方法,引起了广泛的关注和研究。本文将深入探讨…...
vue 大文件视频切片上传处理方法
前端上传大文件、视频的时候会出现超时、过大、很慢等情况,为了解决这一问题,跟后端配合做了一个切片的功能。 我这个切片功能是基于 minion 的,后端会把文件放在minion服务器上。具体看后端怎么做 1、在项目的 util(这个文件夹是自己创建的…...
痞子衡嵌入式:AppCodeHub - 一站网罗恩智浦MCU应用程序
近日,恩智浦官方隆重上线了应用程序代码中心(Application Code Hub,简称 ACH),这是恩智浦 MCUXpresso 软件生态的一个重要组成部分。痞子衡之所以要如此激动地告诉大家这个好消息,是因为 ACH 并不是又一个恩智浦官方 github proje…...
打造数字化营销闭环,破解精准获客难题
现阶段,企业需要进行数字化营销闭环,以实现更精确的客户获取。随着数字技术的迅猛发展,企业需要将在线广告、社交媒体营销和数据分析等工具相互结合,建立一个完整的数字化营销流程。通过使用客户细分、精准定位和个性化广告等手段…...
《雷达像智能识别对抗研究进展》阅读记录
(1)引言 神经网络通常存在鲁棒性缺陷,易受到对抗攻击的威胁。攻击者可以隐蔽的诱导雷达智能目标识别做出错误预测,如: a图是自行车,加上对抗扰动后神经网络就会将其识别为挖掘机。 (2&a…...
【AHB】初识 AHB 总线
AHB 与 APB、ASB同属于 AMBA 总线架构规范,该总线规范由 ARM 公司提出。 目录 一、AHB 总线 二、AHB 总线组成 三、AHB 主从通信过程 一、AHB 总线 AHB(Advanced High Performance Bus),意为高级高性能总线,能将微控制器&…...
Linux服务使用宝塔面板搭建网站,通过内网穿透实现公网访问
文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板,它支持Linux/Windows系统,我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…...
C++ 判断
判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。 下面是大多数编程语言中典型的判断结构的一般形式: 判断语句 C 编程语言…...
“解引用“空指针一定会导致段错误吗?
可能有些朋友看见这个标题第一反应是嵌入式的某些内存中,0地址也是可以被正常访问的,所以对0地址的解引用不会发生错误,但我要说的情况不是这个,而是指一个真正的空指针,不仅是c/c中的0,(void*)0,NULL,还有nullptr,一个真正的空指针. 在c语言中,想获得某结构体的成员变量相对偏…...
釉面陶瓷器皿SOR/2016-175标准上架亚马逊加拿大站
亲爱的釉面陶瓷器皿和玻璃器皿制造商和卖家,亚马逊加拿大站将执行SOR/2016-175法规。这是一份新的法规,规定了含有铅和镉的釉面陶瓷器和玻璃器皿需要满足的要求。让我们一起来看一看,为什么要实行SOR/2016-175法规?这是一个保护消…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
