opencv-基于颜色的目标检测(含代码)

2023-11-18

  先推荐下自己的公众号——Joe学习笔记,公众号上会不定期更新一些文章,主要是自己平时学到的知识,内容包括自动驾驶、计算机视觉、人工智能和机器人技术。我会第一时间把文章更新在公众号上,欢迎大家订阅和分享!文章是从公众号搬过来的。
在这里插入图片描述
  邀请朋友在公众号上分享了一篇云台摄像头跟踪的教程。看了教程,跟着做了摄像头部分的功能,发现说的比较简洁,来具体分析一下。
  这个颜色检测是在HSV颜色空间下进行的。首先把红色跟踪过程封装成函数,单独建个color_trace.py文件,代码如下:

 1	import cv2
 2	import numpy as np
 3	import imutils
 4
 5	def color_trace(color_lower, color_upper, img):
 6		img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # RGB图像转HSV图像
 7		cv2.imshow('hsv', img_hsv)
 8		# 创建掩膜,在(color_lower, color_upper)之间的像素设为255,其它为0
 9 		mask = cv2.inRange(img_hsv, color_lower, color_upper)
10		cv2.imshow('mask', mask)
11
12    	# 腐蚀
13    	mask_erode = cv2.erode(mask, None, iterations = 2)
14    	cv2.imshow('erode', mask_erode)
15    	# 膨胀
16    	mask_dilate = cv2.dilate(mask_erode, (5, 5), iterations = 2)
17    	cv2.imshow('dilate', mask_dilate)
18
19    	# 高斯滤波
20    	mask_gaussian = cv2.GaussianBlur(mask_dilate, (3, 3), 0)
21    	cv2.imshow('mask_gaussian', mask_gaussian)
22
23    	# 寻找轮廓
24    	cnts = cv2.findContours(mask_gaussian.copy(), cv2.RETR_EXTERNAL, 		cv2.CHAIN_APPROX_SIMPLE)
25    	cnts = cnts[0] if imutils.is_cv2() else cnts[1]
26    	#center = None
27    	print(len(cnts))
28    	if len(cnts) > 0:
29        	# 取出最大轮廓
30        	c = max(cnts, key=cv2.contourArea)
31        	# 得到物体中心和物体半径
32        	((x, y), radius) = cv2.minEnclosingCircle(c)
33        # 检测半径大于20像素的物体
34        	if radius > 20:
35            	x, y = int(x), int(y)
36            	# 以物体最小半径画圆
37            	cv2.circle(img, (x, y), int(radius), (0, 255, 255), 2)
38    	return img

  测试用的图片如下图所示:
在这里插入图片描述
  1-3行代码为导入一些需要的模块,第5行代码定义了一个函数,输入的参数分别为需要检测的颜色的下限、上限和图片。第6行和第7行代码是将RGB图像转HSV图像并显示图像。显示的效果如下:
在这里插入图片描述
  第9行和第10行为创建一个mask并显示,在mask中将原图红色的区域用白色表示,其它的区域用黑色表示:
在这里插入图片描述
  接着第12-17行,分别对图像进行了腐蚀和膨胀处理。观察上图的mask,除了红球以外的地方也有一些白点,腐蚀可以很好的去除这些小的白点,效果如下:
在这里插入图片描述
  腐蚀在去除白点的同时也让圆球变小,膨胀操作可以恢复原样,并连通圆球内部的区域,具体的膨胀和腐蚀原理网上有很多教程,就不介绍了。膨胀效果如下:
在这里插入图片描述
  第24-25行是用opencv自带的函数寻找图片中的轮廓,特别说明下25行,24行的寻找轮廓函数在opencv2中的返回值为两个,第1个为轮廓;在opencv3中的返回值为3个,第二个为轮廓。25行中的imutils.is_cv2()用来判断我们用的是opencv2还是opencv3,然后根据判断结果取第1个还是第2个返回值。
  第30-37行代码找出面积最大的轮廓并得到轮廓的半径和中心,然后在输入的图像上画出圆,最后的效果如下图所示:
在这里插入图片描述
  可以看出效果还是非常棒的。主函数的代码如下:

 1	import cv2
 2	import numpy as np
 3	from color_trace import*
 4
 5	red_lower = np.array([170, 43, 46])  # 红色下限
 6	red_upper = np.array([180, 255, 255]) # 红色上限
 7
 8	img = cv2.imread('red1.jpg')
 9	cv2.imshow('red ball', img)
10	img_result = color_trace(red_lower, red_upper, img)
11	cv2.imshow('img_result', img_result)
12	cv2.waitKey(-1)

  第3行类似c语言的头文件,把刚才的color_trace.py文件导入。第5、6行定义了要跟踪的颜色的上限和下限,然后调用函数就可以了。
没有摄像头,但是可以打开笔记本的摄像头来玩一下,新建一个vedio_trace.py文件,代码如下:

 1	import cv2
 2	import numpy as np
 3	from color_trace import*
 4
 5	red_lower = np.array([170, 43, 46])  # 红色下限
 6	red_upper = np.array([180, 255, 255]) # 红色上限
 7
 8	cap=cv2.VideoCapture(0)  # #创建一个VideoCapture对象,笔记本摄像头设为0
 9	while True:
10    	# 逐帧捕获
11    	#第一个参数返回一个布尔值(True / False),代表有没有读取到图片;第二个参数表示截取到一帧的图片
12    	ret, frame = cap.read()
13    	img_result = color_trace(red_lower, red_upper, frame)
14    	cv2.imshow("img_result", img_result)
15    	if cv2.waitKey(1) & 0xFF == ord('q'):
16        	break
17	#当一切结束后,释放VideoCapture对象
18	cap.release()
19	cv2.destroyAllWindows()

  我试了一下发现笔记本的摄像头拍摄的照片颜色有偏差,效果不理想,可能需要调节下红色的上下限。大家可以自己试着玩一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv-基于颜色的目标检测(含代码) 的相关文章

随机推荐

  • IDEA中快捷键大全

    Alt 回车 导入包 自动修正 Ctrl N 查找类 Ctrl Shift N 查找文件 Ctrl Alt L 格式化代码 Ctrl Alt O 优化导入的类和包 Alt Insert 生成代码 如get set方法 构造函数等 Ctrl
  • 【Linux】Linux下的自动化构建工具——make/makefile

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 make和makefile的区别 二 makefile
  • 3. 形状和转换

    文章目录 形状和转换 改变形状 np expand dims np squeeze np reshape arr reshape 反序 转置 arr T np transpose 形状和转换 array 大多数情况下都是以多维的形式出现的
  • combotree 只能选中叶子节点

    combotree 只能选中叶子节点 一 Aphorism 人之所恶在好为人师 慎言之 二 summary 应该分为两种情况 1 第一种情况 单选 multiple false tt combotree nultiple false onB
  • edge浏览器打开出现ref A ref B refC

    打开edge浏览器 设置 或地址栏输入 edge settings privacy 进入 隐私 搜索和服务 选择 cleanbrowsing 重启浏览器 活清理浏览器缓存 第5步里 我是将所有历史都清除了 如果历史或cookie有重要的东西
  • IBM AppScan使用随想

    公司的一个客户让我对他的一个网站进行安全性测试 该网站刚刚完成一期开发 从他给我的别的网站的测试报告中 我发现了IBM AppScan 最后安装了8 0版并成功破解 What s IBM AppScan It s a famous test
  • 第二十章 Chisel基础——生成Verilog与基本测试

    经过前三章的内容 读者已经了解了如何使用Chisel构建一个基本的模块 本章的内容就是在此基础上 把一个Chisel模块编译成Verilog代码 并进一步使用Verilator做一些简单的测试 一 生成Verilog 前面介绍Scala的内
  • 云服务器 宝塔部署SpringBoot前后端分离项目

    博主介绍 小黄鸭技术 擅长领域 Java 实用工具 运维 系列专栏 开发工具 Java之路 八股文之路 如果文章写作时有错误的地方 请各位大佬指正 一起进步 欢迎大家点赞 收藏 评论 支持博主 目录 前言 环境 部署 查看面板地址和用户名以
  • Java设计模式-单例模式

    单例模式 在有些系统中 为了节省内存资源 保证数据内容的一致性 对某些类要求只能创建一个实例 这就是所谓的单例模式 单例模式的定义与特点 单例 Singleton 模式的定义 指一个类只有一个实例 且该类能自行创建这个实例的一种模式 例如
  • MySQL之事务与引擎

    目录 一 事物 1 事务的概念 2 事务的ACID特点 3 事务之间的相互影响 4 Mysql及事务隔离级别 四种 1 查询会话事务隔离级别 2 查询会话事务隔离级别 3 设置全局事务隔离级别 4 设置会话事务隔离级别 5 事务控制语句 6
  • ssm+mysql+小程序+ssm智慧社区管理系统 毕业设计源码101635

    基于SSM的智慧社区管理小程序 摘 要 随着互联网大趋势的到来 社会的方方面面 各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去 而其中最好的方式就是建立网络管理系统 并对其进行信息管理 由于现在网络的发达 社区管理通过网
  • Vue JeecgBoot 下拉选使用数据字典,设置默认值,默认选中第一个值 - 附完整示例

    效果 一 使用步骤 1 导入依赖文件 import initDictOptions filterDictText from components dict JDictSelectUtil 2 声明变量 data return dataVal
  • 巧妙利用unbuffer实时写入

    大家好 我是早九晚十二 目前是做运维相关的工作 写博客是为了积累 希望大家一起进步 我的主页 早九晚十二 场景描述 我们常常在写脚本时 会涉及到一些比较耗时的操作 当要输出日志时 没办法实时获取命令的进度 进而不好判断脚本的流程 这时 就引
  • C# 画坐标,graphics,C# 坐标自定义X轴、Y轴

    先看效果 其中X轴 Y轴都是可以自定义的 可以从零开始 也可以从任意位置开始 看坐标的画法 下面通过五个函数 来分别说明 注意这里坐标的定位是通过外层的Panel来实现的 using System using System Collecti
  • 强化学习中 on-policy与off-policy 的理解;如何区分on-policy 与 off-policy;RL更新策略、policy结构总结

    目录 基本概念 Q learning VS Sarsa DQN VS PPO 区分on policy 与 off policy 一些总结 基本概念 如果要学习的 agent 跟和环境互动的 agent 是同一个的话 这个叫做on polic
  • Linux 查看磁盘容量情况

    查看整体的磁盘容量 df h 详细的磁盘占用情况 du max depth 1 h h是用来把容量显示成易看的方式 max depth 查看的文件的最大深度 进查询某个文件夹的容量 du sh s 和 max depth 0等效
  • 等保2.0介绍

    等保2 0全称网络安全等级保护2 0制度 是我国网络安全领域的基本国策 基本制度 等级保护标准在1 0时代标准的基础上 注重主动防御 从被动防御到事前 事中 事后全流程的安全可信 动态感知和全面审计 实现了对传统信息系统 基础信息网络 云计
  • Jenkins以root用户运行

    Jenkins安装完成后默认会创建一个jenkins的用户 并以jenkins用户运行 在我们通过jenkins编写一些命令的时候容易出现权限不足的提示 permision denied 通过为jenkins工作区赋予777的权限以后 也可
  • 图像处理——边缘检测

    边缘检测 一 边缘检测的目的 二 边缘检测算子有哪些 三 Canny算子 3 1 简述Canny算子 3 2 简述下Canny的计算过程 四 sobel算子 4 1 简述一下sobel算子 五 深度学习下的边缘检测 5 1 HED 整体嵌套
  • opencv-基于颜色的目标检测(含代码)

    先推荐下自己的公众号 Joe学习笔记 公众号上会不定期更新一些文章 主要是自己平时学到的知识 内容包括自动驾驶 计算机视觉 人工智能和机器人技术 我会第一时间把文章更新在公众号上 欢迎大家订阅和分享 文章是从公众号搬过来的 邀请朋友在公众号