OpenCV技巧篇——多目标视觉定位(以飞镖定位为例)

article/2025/10/12 13:31:37

OpenCV技巧篇【1】——多目标视觉定位(以飞镖定位为例)

1、针对问题

多目标视觉定位是指通过计算机视觉技术对一张图片中的多个目标进行识别和定位的过程。本篇将以对飞镖定位为例,提出一个简单有效的多目标定位技巧,最终实现如下图所示的定位效果。
最终效果

2、解决方法

2.1 颜色筛选

首先要考虑所需定位目标通常具有的最显著的特征——颜色,通过将图片从RGB空间转化到HSV色彩空间筛选出颜色对应的色彩。其中:
H(色调):0-180
S(饱和度):0-255
V(黑暗的程度):0-255
下表是HSV取值范围与对应的色彩(通常需要根据环境光线做出相应的调整,以更好地过滤出目标颜色):

色彩绿
H0~1800~1800~180156~1011~2526~3435~7778~99100~124125~155
S0~2550~430~3043~25543~25543~25543~25543~25543~25543~255
V0~4646~220221~25546~25546~25546~25546~25546~25546~25546~255

opencv代码如下:

# 将图片转到HSV域
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 提取红色
lower_red1 = np.array([0, 43, 46])  # 红色阈值下界
higher_red1 = np.array([10, 255, 255])  # 红色阈值上界
mask_red1 = cv2.inRange(hsv, lower_red1, higher_red1)
lower_red2 = np.array([156, 43, 46])  # 红色阈值下界
higher_red2 = np.array([180, 255, 255])  # 红色阈值上界
mask_red2 = cv2.inRange(hsv, lower_red2, higher_red2)
mask_red = cv2.add(mask_red1, mask_red2)  # 拼接过滤后的mask
cv2.imshow("mask_red", mask_red)
# 提取绿色
lower_green = np.array([35, 43, 46])  # 绿色阈值下界
higher_green = np.array([77, 255, 255])  # 绿色阈值上界
mask_green = cv2.inRange(hsv, lower_green, higher_green)
cv2.imshow("mask_green",mask_green)

绿色飞镖过滤效果如下所示:
在这里插入图片描述

2.2 多目标识别

我们得到了经过颜色过滤后的mask图片,之后需要用ROI将每个单一飞镖裁剪出来,但如何将这多个飞镖的位置分别获取出来就是一个问题,许多人会去使用遍历的方法,通过在各个方向上寻找边缘来定位,但在有多个目标存在的情况下,这种方法往往效果不佳,而这里使用的方法是这样的:

第一步 纵向求和
由于在mask图片中,飞镖区域的值为255,其他区域的值为0,因此可以采用纵向求和的方式(也可以认为是向x轴投影的分布情况),来定位出飞镖的横向坐标范围。
在这里插入图片描述
第二步 横向求和
考虑到有可能出现下图所示的情况,因此在纵向求和获得横向定位坐标范围后,按照此范围内裁剪mask图片,并进行横向求和(也可以认为是向y轴投影的分布情况),来定位出飞镖的纵向坐标范围。最终将得每个到单一飞镖的具体横纵坐标范围。
在这里插入图片描述
同时考虑到背景中存在微量不连续杂色的可能性,可以在获取范围时加入阈值判断,多目标识别具体代码如下:

# 获得X轴分布
x_list_left = []
x_list_right = []
x_distribute = mask_red.sum(axis=0)/255
# plt.plot(mask_red.sum(axis=0)/255)
# plt.plot(mask_red.sum(axis=1)/255)
# plt.show()
# plt.waitforbuttonpress()
for i in range(3,len(x_distribute)-3):if x_distribute[i]==0 and x_distribute[i+1]>0 and x_distribute[i:i+3].sum()>3:x_list_left.append(i)elif x_distribute[i-3:i].sum()>3 and x_distribute[i]>0 and x_distribute[i+1]==0:x_list_right.append(i+1)# 基于X轴,获得Y轴分布,并获得所有可能区域ranges_list = []for j in range(min([len(x_list_left),len(x_list_right)])):y_distribute = mask_red[:,x_list_left[j]:x_list_right[j]].sum(axis=1)/255# 获得Y轴分布y_list_left = []y_list_right = []for i in range(3,len(y_distribute)-3):if y_distribute[i]==0 and y_distribute[i+1]>0 and y_distribute[i:i+5].sum()>3:y_list_left.append(i)elif y_distribute[i-3:i].sum()>3 and y_distribute[i]>0 and y_distribute[i+1]==0:y_list_right.append(i+1)# 获得所有可能区域for i in range(min([len(y_list_left),len(y_list_right)])):if (y_list_right[i]-y_list_left[i]) > 30 and (x_list_right[j]-x_list_left[j]) > 30:ranges_list.append((x_list_left[j],x_list_right[j],y_list_left[i],y_list_right[i]))

第三步 求取坐标
对于如下所示的裁剪出的单一飞镖,只需算得最下层的均值所在位置,即可得到飞镖的像素坐标。
在这里插入图片描述

# 遍历所有飞镖
green_point = []
for i in range(len(ranges_list)):# ROI裁剪max_x = ranges_list[i][1]min_x = ranges_list[i][0]max_y = ranges_list[i][3]min_y = ranges_list[i][2]green_position_x = int(np.where(mask_green[min_x:max_x,min_y:max_y]==255)[0].mean())+min_xgreen_position_y = int(np.where(mask_green[min_x:max_x,min_y:max_y]==255)[1].mean())+min_ycv2.circle(result, green_position,10,(0,255,0),5)green_point.append(green_position)

3、完整代码

对所有红色飞镖进行定位。

import cv2
import numpy as np
import matplotlib.pyplot as pltcap = cv2.VideoCapture(1)while(1):_, frame = cap.read()cv2.imshow("result", frame)hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)# 提取红色lower_red1 = np.array([0, 160, 120])  # 红色阈值下界higher_red1 = np.array([10, 255, 255])  # 红色阈值上界mask_red1 = cv2.inRange(hsv, lower_red1, higher_red1)lower_red2 = np.array([170, 160, 120])  # 红色阈值下界higher_red2 = np.array([180, 255, 255])  # 红色阈值上界mask_red2 = cv2.inRange(hsv, lower_red2, higher_red2)mask_red = cv2.add(mask_red1, mask_red2)  # 拼接过滤后的maskcv2.imshow("mask_red", mask_red)# 获得X轴分布x_distribute = mask_red.sum(axis=0)/255x_list_left = []x_list_right = []for i in range(3,len(x_distribute)-3):if x_distribute[i]==0 and x_distribute[i+1]>0 and x_distribute[i:i+3].sum()>3:x_list_left.append(i)elif x_distribute[i-3:i].sum()>3 and x_distribute[i]>0 and x_distribute[i+1]==0:x_list_right.append(i+1)# 基于X轴,获得Y轴分布,并获得所有可能区域ranges_list = []for j in range(min([len(x_list_left),len(x_list_right)])):y_distribute = mask_red[:,x_list_left[j]:x_list_right[j]].sum(axis=1)/255# 获得Y轴分布y_list_left = []y_list_right = []for i in range(3,len(y_distribute)-3):if y_distribute[i]==0 and y_distribute[i+1]>0 and y_distribute[i:i+3].sum()>3:y_list_left.append(i)elif y_distribute[i-3:i].sum()>3 and y_distribute[i]>0 and y_distribute[i+1]==0:y_list_right.append(i+1)# 获得所有可能区域for i in range(min([len(y_list_left),len(y_list_right)])):if (y_list_right[i]-y_list_left[i]) > 30 and (x_list_right[j]-x_list_left[j]) > 30:ranges_list.append((x_list_left[j],x_list_right[j],y_list_left[i],y_list_right[i]))try:red_point = []for i in range(len(ranges_list)):# ROI裁剪max_x = ranges_list[i][1]min_x = ranges_list[i][0]max_y = ranges_list[i][3]min_y = ranges_list[i][2]flag=0for j in range(max_y-1,min_y-1,-1):if flag==1:breakfor i in range(min_x,max_x):if mask_red[j,i]==255:red_position=(i,j+5)flag=1breakcv2.circle(frame, red_position,10,(0,0,255),5)red_point.append(red_position)print("红色坐标:",red_point)except:cv2.waitKey(5)continuecv2.waitKey(5)
cv2.destroyAllWindows()
cap.release()

http://chatgpt.dhexx.cn/article/1X3K3s5y.shtml

相关文章

目标定位算法(二)之基于测距的定位算法

文章目录 基于测距的定位算法1.最小二乘原理2.最小二乘定位算法3.基于RSSI测距的定位算法4.基于TOA/TDOA的目标定位算法1)基于TOA测距2)基于TDOA测距 基于测距的定位算法 非测距的定位算法往往误差较大,提高精度往往依赖于密集的观测站部署。…

YOLO v5与双目测距结合,实现目标的识别和定位测距

YOLO v5与双目测距结合,实现目标的识别和定位测距 1、首先安装YOLO v52、数据集的标定3、双目测距代码的单独运行调试4、YOLO v5与双目测距的代码的结合5、最终识别测距效果6、代码下载调试运行7、最终演示视频欢迎各位点赞投币收藏哦🤣🤣&am…

单目视觉的运动目标跟踪定位

[转] http://www.leiphone.com/news/201704/z87wjT8j9s94tMnG.html 市场上空间定位的技术方案分为单目、双目以及激光雷达三大阵营,其中激光雷达由于成本高昂市场接受度较低,而在都是基于计算机视觉的单目和双目中,双目则显得更受欢迎。在国内…

目标定位

声明:本文引用吴恩达教授的DeepLearning课程内容。 图像分类:图片分类问题并不陌生,例如,输入一张图片到多层卷积神经网络。这就是卷积神经网络,它会输出一个特征向量,并反馈给 softmax 单元来预测图片类型…

目标定位与检测

学习笔记仅用作自己复习 https://b23.tv/JAqvgA Object Recognition Object Detection Object Localization 位置表示,x,y中心点坐标,w宽度,h高度,就可以得到矩形框的范围。(先找中心点再得到矩形框) 黄色全连接层是…

定位目标地理位置

获取目标地理位置 一、GPS简介及分布二、定位工具:Seeker三、反向代理:Ngrok四、实战:获取目标地理位置1.运行 seeker2.上传 ngrok3.短链接伪装4.转发链接 一、GPS简介及分布 物理位置定位:根据P的定位不准确,容易被欺…

目标定位算法(四)之移动目标定位算法

文章目录 移动目标定位算法1.移动目标计算机仿真建模2.基于距离观测的运动目标定位3.纯方位角的运动目标定位 移动目标定位算法 实时探测目标并对目标进行实时定位。 1.移动目标计算机仿真建模 假定目标做匀速直线运动,第i个观测站的位置为(x,y),目标…

目标定位跟踪系统概述

一、观测系统:目标、观测站、坐标系。 观测站如雷达、声纳等传感器。坐标系:二维、三维直角坐标系(描述确定位置);极坐标系(r,cita)、球坐标系(r,cita,fai)(利用角度描述位置&#x…

目标定位算法(三)之基于角度的定位算法

文章目录 基于角度测量的定位算法1.双战角度定位2.三角测量法定位 基于角度测量的定位算法 又叫纯方位目标定位,它的测量信息是目标与观测站之间的角度,包括方向角和俯仰角等。 1.双战角度定位 例:有两个观测站,其中A观测站的位…

目标检测之目标定位

目标检测是计算机视觉领域中一个新兴的应用方向,相比前两年,它的性能越来越好。在构建对象检测之前,我们先了解一下对象定位,首先我们看看它的定义。 图片分类任务我们已经熟悉了,就是算法遍历图片,判断其中…

深度学习——目标定位

目标定位 图片分类任务我们已经熟悉了,就是算法遍历图片,判断其中的对象是不是汽车,这就是图片分类。这节课我们要学习构建神经网络的另一个问题,即定位分类问题。这意味着,我们不仅要用算法判断图片中是不是一辆汽车&…

目标检测及目标定位

一、概述 本文是关于目标检测后根据物体的坐标来确定物体所处的区域,适用于需要根据物体在图像中的位置来分别判断的情况,而且对应的是YOLOv5模型。YOLOv5目标检测的内容可以看看我之前的一篇文章YOLOv5训练自己的数据集_ONEPIECE_00的博客-CSDN博客 本…

一、目标定位

1、目标定位是要求图像中只有一个目标,则构建这个目标的位置信息,如一个网络输出8个值,一个是是否有目标的pc,4个目标位置信息的bx,by,bh,bw,其中bx,by为目标中心点坐标,bh,bw为目标的高和宽,最…

3-1 目标定位

目标定位( Object localization) 图片分类任务就是算法遍历图片,判断其中的对象是不是某个指定的类别,这就是图片分类。 定位分类问题。意味着我们不仅要用算法判断图片中是不是一辆汽车,还要在图片中标记出它的位置&a…

深度学习(十五):目标定位 Object Localization

这是一系列深度学习的介绍,本文不会涉及公式推导,主要是一些算法思想的随笔记录。 适用人群:深度学习初学者,转AI的开发人员。 编程语言:Python 参考资料:吴恩达老师的深度学习系列视频 吴恩达老师深度学习…

第二十五节,初步认识目标定位、特征点检测、目标检测

一 目标定位(单个物体) 对象检测,它是计算机视觉领域中一个新兴的应用方向,相比前两年,它的性能越来越好。在构建对象检测之前,我们先了解一下对象定位,首先我们看看它的定义。 图片分类任务我们已经熟悉了&#xff0c…

目标定位和特征点检测

1. 目标定位 目标检测是计算机视觉领域中的一个新兴的应用方向,在构建目标检测之前,我们首先了解一下object localization目标定位。 前面说过的图片分类任务就是算法遍历图片,判断其中的对象是不是汽车,主要是图片分类 这里所…

目标定位(Object localization)

来源:Coursera吴恩达深度学习课程 在构建目标检测之前,建议先了解一下目标定位(object localization)。 在上图的这个例子中,图片分类(image classification)不仅要判断图片中是不是一辆汽车&a…

学习云计算从哪里入手

学习云计算从哪里入手 1、 学习思路 a) 学习前建议先了解 i. 什么是云计算 ii. 云计算对当前的商业模式有什么影响 iii. 云计算所涉及到的技术 iv. 云计算的现状 b) 云计算可以分为广义的和狭义的两类&…

云计算学习(1)

原文来自于HCIA-Cloud Computing 华为云计算工程师认证 --hsyl007学习笔记收集整理 ,个人博客地址 http://hsyl007.work/zblog/ 什么是云计算 云计算就在身边 将资源准备好,通过特定技术随时随地使用这些资源去执行特定任务的方式基本就属于云计算类…