Opencv学习记录(三) —— 得到图像中目标物坐标的简单处理算法(望指正与补充)
先描述一下使用场景:
我要识别一个红灯,已经把目标准确的提取出来了,二值图像中白色为目标物,现在要算出二值图中的白色像素点的坐标。因为之后需要移植到树莓派,所以需要高效的方法。
需要找出白色中心点
第一想到的肯定就是for for 了,然而效率太低,320*240迭代下来花费10ms。优点效果好,稳定在目标物的中心。
优化的方法:
1、在不丢失目标的情况下缩小图像进行扫描
2、内循环根据因子迭代,不满足则下一层。也就是在行扫描的时候,如果满足则条件设为后一个像素,不满足则进行下一行扫描。(问题:如果目标区域不连续,该行扫描不完就跳出了)
#传统扫描 :耗时10ms 约占总时间1/3,显然很浪费。优点:在图像处理算法准确的时候坐标精确
#优化方式:1、在不丢失目标的情况下缩小图像进行扫描 2、内循环根据因子迭代,不满足则下一层
def get_Target_Location(image):size = image.shape#print sizeh = size[0]w = size[1]num_x = 0num_y = 0x=0y=0num = 0#tt = cv2.getTickCount()for i in range(w):for j in range(h):if image.item(j,i) & 255: #(x,y) = (j,i)num_x += inum_y += jnum += 1if num > 0:x = int(num_x/num)y = int(num_y/num)#print (cv2.getTickCount() - tt)/cv2.getTickFrequency() # 传统扫描:耗时10ms 约占总时间1/3,显然很浪费。优点:在图像处理算法准确的时候坐标精确return x,y,num
第二种方法,粗略扫描(两点法),从左上角开始扫描,也是一行一行的扫描,当发现有满足的像素时,跳出并记录该点的x。继续在该行从行最大扫描到记录的x点,发现有满足的即结束循环。算出两次记录的平均值,即为目标中点。若找y,则一列一列的扫描,记录两次y算中点。 耗时: 0.5 - 2ms
问题:1、目标物对称才好确定。 2、两点波动性大 。 3、区域不连续仍然不好确定
def get_mid_x(image):size = image.shapeh = size[0]w = size[1]flag_back = 0x = 0y = 0ttt = cv2.getTickCount()for i in range(0,h,3):for j in range(w):if image.item(i, j) & 255:flag_back = 1y = ix = jbreakif flag_back:breakfor k in range(w,x):if image.item(y, k) & 255:x = (k+x)/2return x,y,1print (cv2.getTickCount() - ttt)/cv2.getTickFrequency() # 粗略扫描2:耗时 0.5 - 2ms 缺点:目标较近时,波动大return x, y, 0def get_mid_y(image): #不需要找y了size = image.shapeh = size[0]w = size[1]flag_back = 0x = 0y = 0ttt = cv2.getTickCount()for i in range(0,w,3):for j in range(h):if image.item(j, i) & 255:flag_back = 1y = jx = ibreakif flag_back:breakfor k in range(h,y):if image.item(k, x) & 255:y = (k+y)/2return x,y,1print (cv2.getTickCount() - ttt)/cv2.getTickFrequency() # 粗略扫描:耗时 0.5 - 2ms 缺点:目标较近时,波动大return x, y, 0
结合上两种,只找第一点,然后根据自己的需要(我所需要的是x),进行该行扫描,扫描完成后判断该行满足要求像素多少,若数量达到要求则完成,否则继续扫描下一行直到该行目标像素满足要求。最后取均值得出x的中点。耗时 1 - 3ms..该方法解决了两点不稳定性,并且有效缩短了时间。但所制定的满足要求像素的数量需要确定好。
- 增加Y轴的值,即得出目标物的长和宽。在第k行找到x后,从图像最下面的x坐标(x,height)开始扫描,到我们得到x的坐标的点(x,k),如果找到满足目标的像素值(255)则跳出循环,中间的则为高度。称之为十字扫描法(效果不错)。
def get_mid_X(image, min_p):size = image.shapeh = size[0]w = size[1]flag_back = 0sum_x = 0num = 0x = 0y = 0y_num = 0# tt = cv2.getTickCount()for i in range(0, h, 3):for j in range(w):if image.item(i, j) & 255:sum_x += jnum += 1else:if num > min_p:breakif num > min_p:x = int(sum_x / num)y = ibreakif x > 0:for k in range(1, h - y):if image.item(h - k, x) & 255:y_num = h - k - ybreak# print (cv2.getTickCount() - ttt)/cv2.getTickFrequency() # 粗略扫描1:耗时 2ms左右 缺点:目标较近时,波动大# print numreturn x, y, y_num
效果图:分别对应三种。图二即使加了高斯滤波抖动还是比较大
代码链接(包括树莓派端实现的自动寻灯小车代码)
Opencv学习记录(三) —— 得到图像中目标物坐标的简单处理算法(望指正与补充)相关推荐
- OpenCV学习记录 三 (傅里叶逆变换原理及实现)
为什么要在频率域研究图像增强? 利用频率成分和图像外表之间的对应关系.滤波在频率域更为直观,它可以解释空间域滤波的某些性质.可以在频率域指定滤波器,做反变换,然后在空间域使用结果滤波器作为空间域滤波器 ...
- 《OpenCv视觉之眼》Python图像处理十六:Opencv图像处理实战一之图像中的硬币检测
本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...
- 图像中目标的绝对位置信息(2)--Global Pooling, More than Meets the Eye: Position Information is Encoded Channel-
关于偶数卷积核和padding的副作用可以参考这个博客. 首先,本文是翻译了 ICCV 2021的一篇文章:Global Pooling, More than Meets the Eye: Posit ...
- 使用Python,OpenCV,K-Means聚类查找图像中最主要的颜色
Python,OpenCV,K-Means聚类查找图像中最主要的颜色 1. K-Means是什么? 2. 步骤 3. 效果图 4. 源代码 参考 对于肉眼来说,从一幅图中识别出主要颜色很容易.那怎么用 ...
- MySQL学习记录 (三) ----- SQL数据定义语句(DDL)
相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...
- Kafka学习记录(三)——Broker
Kafka学习记录(三)--Broker 目录 Kafka学习记录(三)--Broker 对应课程 Zookeeper存储的Kafka信息 Broker总体工作流程 Broker的服役和退役 Kafk ...
- 使用Python,OpenCV和Hough圆检测图像中的圆
使用Python,OpenCV和Hough圆检测图像中的圆 1. 效果图 2. cv2.HoughCircles(image, method, dp, minDist) 3. 源码 参考 前几篇博客中 ...
- OpenCV演示代码以查找图像中的轮廓(附完整代码)
OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 #include "opencv2/imgcodecs.hpp&quo ...
- css学习记录三:文本属性
css学习记录三:CSS文本属性 一.文本属性的作用 二.文本颜色 三.文本对齐 四.装饰文本 五.文本缩进 六.行间距 一.文本属性的作用 CSSS Text(文本)属性可定义文本的外观,比如文本的 ...
最新文章
- 【iOS】中间透明的引导蒙层
- 为什么要用promise处理ajax,用promise.all解决ajax异步循环请求问题
- C++运算符重载(成员函数方式)
- 警惕成教自考_不,保持警惕不会伤害Java。 关于Java许可的评论。
- 驱动、数据库-Java HIVE 使用Jdbc连接Hive-by小雨
- raid卡组不同raid_RAID 类型介绍
- Linux下USB转串口的驱动【转】
- (转)webstorm快捷键
- QT5.9 for 安卓开发 环境配置
- 【历史上的今天】11 月 21 日:第一个阿帕网连接建立;乐视网成立;爱迪生发明留声机
- 为什么打印还要另存为_为什么打印时会出现另存为保存文件
- 微信小程序定制价格多少钱
- 【GitHub】Your account has been flagged.解决方法
- Magento前台不显示添加的产品
- 通信工程师出差生存指南
- WorldView卫星家族简介
- Webpack 4教程 - 第四部分,使用SplitChunksPlugin分离代码
- 揭秘蓝牙定位技术,实现精准室内导航
- 计算机考试屏蔽范围,哪些屏蔽设备可用于计算机机房的电磁屏蔽?
- 视频教程-MMOARPG地下守护神_单机版实战视频课程(上部) -Unity3D
热门文章
- 麒麟服务器下更新raid驱动
- 除了Sublime Text ,还有啥笔记应用能double代码效率?
- java web 酒店管理系统_GitHub - inkss/hotelbook-JavaWeb: 酒店管理系统-JavaWeb期末项目。...
- arcgis server里预览地图显示空白
- 2019年胡润百富榜发布,比特大陆创始人詹克团成「中国区块链首富」!
- 京东Java岗:来自面试官的夺命连环56问,直接当场怀疑人生~
- python cpu count_Python multiprocessing.cpu_count方法代码示例
- 裁员之外,京东还在偷偷做这件事
- ns3 Traffic Control Layer解读
- matlab cbfreeze,Matlab:如何在同一图中为不同的表面指定不同的色图/色块