高噪点灰度图目标粗定位CoraseLocation
高噪点的灰度图目标粗定位
/*
** @name: CoraseLocation
** @brief: 粗定位
** @param:[in] srcGray 灰度图()
** @param:[in] box 目标尺寸(像素)
** @param:[ou] roi 目标定位结果
** @return: true=成功,false=失败
*/
bool CoraseLocation(cv::Mat& srcGray, cv::Size box, cv::Rect& roi){try{if (srcGray.empty()) return false;if (srcGray.channels() != 1) return false;if (box.width < 4 || box.width >= srcGray.cols) return false;if (box.height < 4 || box.height >= srcGray.rows) return false;//roi = cv::Rect(0, 0, srcGray.cols, srcGray.rows);// STEP01: 计算影像平均灰度与标准差cv::Scalar meanVal, devVal;cv::meanStdDev(srcGray, meanVal, devVal);// STEP02: 计算积分图(寻找目标:亮区或暗区)cv::Mat srcInte;cv::integral(srcGray, srcInte, CV_64F);// STEP03: 寻找亮区和暗区cv::Point ptMin(-1, -1), ptMax(-1, -1);double valMin = DBL_MAX, valMax = DBL_MIN;for (int y = 0; y < srcInte.rows - box.height; y += box.height / 2){for (int x = 0; x < srcInte.cols - box.width; x += box.width / 2){double left_top = srcInte.at<double>(y, x);double left_bottom = srcInte.at<double>(y + box.height, x);double right_top = srcInte.at<double>(y, x + box.width);double right_bottom = srcInte.at<double>(y + box.height, x + box.width);//double valBox = right_bottom - left_bottom - right_top + left_top;if (valMin > valBox){valMin = valBox;ptMin.x = x + 1;ptMin.y = y + 1;}if (valMax < valBox){valMax = valBox;ptMax.x = x + 1;ptMax.y = y + 1;}}}valMin /= box.area();valMax /= box.area();// STEP04: 判断目标是亮区还是暗区,并重新转换为二值图bool isWhiteMark = false;cv::Mat srcBin;if (abs(valMin - meanVal[0]) > abs(valMax - meanVal[0])){// valmin: mark为暗roi = cv::Rect(ptMin.x, ptMin.y, box.width, box.height);isWhiteMark = false;cv::threshold(srcGray, srcBin, valMin - devVal[0], 255, cv::THRESH_BINARY_INV);}else {// valmax: mark为亮roi = cv::Rect(ptMax.x, ptMax.y, box.width, box.height);isWhiteMark = true;cv::threshold(srcGray, srcBin, valMax + devVal[0], 255, cv::THRESH_BINARY);}// STEP05: 根据二值图,调整目标区域std::vector<std::vector<cv::Point>> contours;cv::findContours(srcBin, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);valMax = DBL_MIN;int idxMax = -1;for (int i = 0; i < contours.size(); ++i){auto area = cv::contourArea(contours[i]);if (valMax < area){valMax = area;idxMax = i;}}if (idxMax < 0){return -1;}// STEP06: 输出拟合后的目标区域roi = cv::boundingRect(contours[idxMax]);return true;}catch (...){}return false;
}
效果:
相关文章:
高噪点灰度图目标粗定位CoraseLocation
高噪点的灰度图目标粗定位 /* ** name: CoraseLocation ** brief: 粗定位 ** param:[in] srcGray 灰度图() ** param:[in] box 目标尺寸(像素) ** param:[ou] roi 目标定位结果 ** return: true成功,false…...
Android:Google三方库之Firebase集成详细步骤(二)
Analytics分析 1、将 Firebase 添加到您的 Android 项目(如果尚未添加),并确保在 Firebase 项目中启用了 Google Analytics(分析): 如果您要创建新的 Firebase 项目,请在项目创建过程中启用 G…...
java使用freemarker模板生成html,再生成pdf
1.freemarker模板生成html 添加Maven依赖 在pom.xml文件中添加以下依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId> </dependency>创建Freemarker…...

图解系列--Web服务器,Http首部
1.用单台虚拟主机实现多个域名 HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点。。比如,提供 Web 托管服务(Web Hosting Service)的供应商,可以用一台服务器为多位客户服务,也可以以每位客户持有的域名运行各自不…...

直线(蓝桥杯)
直线 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。 给定平面上 2 3 个…...
Android:从源码看FragmentManager如何工作
一个Activity中,在某一个容器中,更换不同的Fragment,从而显示不同的界面,这个场景相信大家已经非常熟悉了,也知道Activity是通过FragmentManager来管理嵌入的Fragments的,所以今天就来看看FragmentManager是…...

LabVIEW通过编程将图形类控件的X轴显示为时间戳
LabVIEW通过编程将图形类控件的X轴显示为时间戳 每个版本的LabVIEW中都有属性节点,可以以编程方式调整X轴和Y轴格式。对于不同版本的LabVIEW,这些属性节点无法在同一个位置找到。请参阅以下部分,了解特定版本LabVIEW的相关属性节点的位置。 …...

Spring Boot进行单元测试,一个思路解决重启低效难题!
所谓单元测试就是对功能最小粒度的测试,落实到JAVA中就是对单个方法的测试。 junit可以完成单个方法的测试,但是对于Spring体系下的web应用的单元测试是无能为力的。因为spring体系下的web应用都采用了MVC三层架构,依托于IOC,层级…...
c/c++ header_only 头文件实现的关键点
header_only 头文件实现的关键点 ------------------------------------------------------------------------- author: hjjdebug date: 2023年 11月 28日 星期二 16:58:38 CST descriptor: header_only 头文件实现的关键点1. 对外声明的函数必需加上inline, 消除连接的歧义…...
Linux(CentOS7.5):通过docker安装redis
一、准备配置文件 在宿主机,准备映射配置文件的目录下,运行如下: wget http://download.redis.io/redis-stable/redis.conf二、安装 docker run \ --restartalways \ --log-opt max-size100m \ --log-opt max-file2 \ -p 6380:6379 \ -v /opt…...
唯创知音WT588F02B-8S语音芯片:灵活更换语音内容,降低开发成本与备货压力
在电子产品的开发阶段,语音芯片的选择与使用对于产品的功能、成本和上市时间都有着重要影响。唯创知音的WT588F02B-8S语音芯片以其独特的优势,成为工程师们的理想选择,尤其在样品阶段,它为工程师提供了自行更换语音内容的便利&…...

git的创建以及使用
1、上传本地仓库 首先确定项目根目录中没有.git文件,有的话就删了,没有就下一步。在终端中输入git init命令。注意必须是根目录! 将代码存到暂存区 将代码保存到本地仓库 2、创建git仓库 仓库名称和路径(name)随便写…...
面试笔记--Linux常用命令
文件和目录操作: ls: 列出目录内容 例子:ls -l - 列出详细信息,包括权限、所有者等 cd: 切换目录 例子:cd Documents - 进入 “Documents” 目录 pwd: 显示当前工作目录 例子:pwd - 显示当前工作目录的路径 cp: 复制文…...

【小黑嵌入式系统第十课】μC/OS-III概况——实时操作系统的特点、基本概念(内核任务中断)、与硬件的关系实现
文章目录 一、为什么要学习μC/OS-III二、嵌入式操作系统的发展历史三、实时操作系统的特点四、基本概念1. 前后台系统2. 操作系统3. 实时操作系统(RTOS)4. 内核5. 任务6. 任务优先级7. 任务切换8. 调度9. 非抢占式(合作式)内核10…...
在easyswoole 中,配置文件如何加载外部配置
在一个项目中 目录结构是这样的 网站的公共配置,包括一些数据库连接配置,redis连接配置 /web/config/redis_config.php/web/config/mysql_config.php 下面是Easyswoole 项目目录 所有的配置均放在ES项目中的Config目录中 文件名且采用大驼峰命名。如…...
小程序微信支付API?以及参数有哪些
微信小程序支付API有两个,分别是 wx.chooseWXPay 和 wx.pay。 wx.chooseWXPay 是用于唤起微信支付的API,它支持扫码支付、JSAPI支付、APP支付等。它返回一个Promise对象,可以在then方法中处理支付结果。 wx.pay 是用于发起微信支付的API&am…...

【算法】一个简单的整数问题(树状数组、差分)
题目 给定长度为 N 的数列 A,然后输入 M 行操作指令。 第一类指令形如 C l r d,表示把数列中第 l∼r 个数都加 d。 第二类指令形如 Q x,表示询问数列中第 x 个数的值。 对于每个询问,输出一个整数表示答案。 输入格式 第一行…...

Android flutter项目 启动优化实战(二)利用 App Startup 优化项目和使用flutterboost中的问题解决
背景 书接上回: Android flutter项目 启动优化实战(一)使用benchmark分析项目 已经分析出了问题: 1.缩短总时长(解决黑屏问题、懒启动、优化流程)、2.优化启动项(使用App Startup)、3.提升用…...

Java---权限修饰符、final、static
文章目录 1. 权限修饰符2. final(最终态)3. static(静态) 1. 权限修饰符 修饰符同一个类中同一个包中的子类和无关类不同包的子类不同包的无关类private√默认√√protected√√√public√√√√ 2. final(最终态) 1. final关键字是最终的意思,可以修饰成员方法、…...
unity实时保存对象的位姿,重新运行程序时用最后保存的数据给物体赋值
using UnityEngine; using System.IO; // using System.Xml.Serialization; public class SaveCoordinates : MonoBehaviour {public GameObject MainObject;//读取坐标private float x;private float y;private float z;private Quaternion quaternion;private void Start(){/…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...