先描述一下使用场景:

我要识别一个红灯,已经把目标准确的提取出来了,二值图像中白色为目标物,现在要算出二值图中的白色像素点的坐标。因为之后需要移植到树莓派,所以需要高效的方法。

             需要找出白色中心点

  • 第一想到的肯定就是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学习记录(三) —— 得到图像中目标物坐标的简单处理算法(望指正与补充)相关推荐

  1. OpenCV学习记录 三 (傅里叶逆变换原理及实现)

    为什么要在频率域研究图像增强? 利用频率成分和图像外表之间的对应关系.滤波在频率域更为直观,它可以解释空间域滤波的某些性质.可以在频率域指定滤波器,做反变换,然后在空间域使用结果滤波器作为空间域滤波器 ...

  2. 《OpenCv视觉之眼》Python图像处理十六:Opencv图像处理实战一之图像中的硬币检测

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  3. 图像中目标的绝对位置信息(2)--Global Pooling, More than Meets the Eye: Position Information is Encoded Channel-

    关于偶数卷积核和padding的副作用可以参考这个博客. 首先,本文是翻译了 ICCV 2021的一篇文章:Global Pooling, More than Meets the Eye: Posit ...

  4. 使用Python,OpenCV,K-Means聚类查找图像中最主要的颜色

    Python,OpenCV,K-Means聚类查找图像中最主要的颜色 1. K-Means是什么? 2. 步骤 3. 效果图 4. 源代码 参考 对于肉眼来说,从一幅图中识别出主要颜色很容易.那怎么用 ...

  5. MySQL学习记录 (三) ----- SQL数据定义语句(DDL)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  6. Kafka学习记录(三)——Broker

    Kafka学习记录(三)--Broker 目录 Kafka学习记录(三)--Broker 对应课程 Zookeeper存储的Kafka信息 Broker总体工作流程 Broker的服役和退役 Kafk ...

  7. 使用Python,OpenCV和Hough圆检测图像中的圆

    使用Python,OpenCV和Hough圆检测图像中的圆 1. 效果图 2. cv2.HoughCircles(image, method, dp, minDist) 3. 源码 参考 前几篇博客中 ...

  8. OpenCV演示代码以查找图像中的轮廓(附完整代码)

    OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 #include "opencv2/imgcodecs.hpp&quo ...

  9. css学习记录三:文本属性

    css学习记录三:CSS文本属性 一.文本属性的作用 二.文本颜色 三.文本对齐 四.装饰文本 五.文本缩进 六.行间距 一.文本属性的作用 CSSS Text(文本)属性可定义文本的外观,比如文本的 ...

最新文章

  1. 【iOS】中间透明的引导蒙层
  2. 为什么要用promise处理ajax,用promise.all解决ajax异步循环请求问题
  3. C++运算符重载(成员函数方式)
  4. 警惕成教自考_不,保持警惕不会伤害Java。 关于Java许可的评论。
  5. 驱动、数据库-Java HIVE 使用Jdbc连接Hive-by小雨
  6. raid卡组不同raid_RAID 类型介绍
  7. Linux下USB转串口的驱动【转】
  8. (转)webstorm快捷键
  9. QT5.9 for 安卓开发 环境配置
  10. 【历史上的今天】11 月 21 日:第一个阿帕网连接建立;乐视网成立;爱迪生发明留声机
  11. 为什么打印还要另存为_为什么打印时会出现另存为保存文件
  12. 微信小程序定制价格多少钱
  13. 【GitHub】Your account has been flagged.解决方法
  14. Magento前台不显示添加的产品
  15. 通信工程师出差生存指南
  16. WorldView卫星家族简介
  17. Webpack 4教程 - 第四部分,使用SplitChunksPlugin分离代码
  18. 揭秘蓝牙定位技术,实现精准室内导航
  19. 计算机考试屏蔽范围,哪些屏蔽设备可用于计算机机房的电磁屏蔽?
  20. 视频教程-MMOARPG地下守护神_单机版实战视频课程(上部) -Unity3D

热门文章

  1. 麒麟服务器下更新raid驱动
  2. 除了Sublime Text ,还有啥笔记应用能double代码效率?
  3. java web 酒店管理系统_GitHub - inkss/hotelbook-JavaWeb: 酒店管理系统-JavaWeb期末项目。...
  4. arcgis server里预览地图显示空白
  5. 2019年胡润百富榜发布,比特大陆创始人詹克团成「中国区块链首富」!
  6. 京东Java岗:来自面试官的夺命连环56问,直接当场怀疑人生~
  7. python cpu count_Python multiprocessing.cpu_count方法代码示例
  8. 裁员之外,京东还在偷偷做这件事
  9. ns3 Traffic Control Layer解读
  10. matlab cbfreeze,Matlab:如何在同一图中为不同的表面指定不同的色图/色块