Python+Opencv根据颜色进行目标检测

15 篇文章 7 订阅

一、什么是颜色目标检测?

  所谓的颜色目标检测,即根据物体的颜色来快速的进行目标定位,该算法的思路比较简单,但是却有很大的使用价值。

二、如何实现基于颜色的目标检测?

  整个算法的实现步骤比较简单,具体的步骤如下所示:

  • 步骤1-根据图片中的目标设定合适的lower和upper阈值
  • 步骤2-使用cv2.inRange(img,lower, upper)函数来进行阈值化操作,其中lower和upper就是我们所设定的阈值;
  • 步骤3-使用cv2.bitwise_and()函数进行与操作,即选择出合适的目标;

三、算法代码实现

# coding=utf-8
# 导入python包
import numpy as np
import argparse
import imageio
import cv2

# 设置并解析参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", help = "path to the image")
args = vars(ap.parse_args())

# 读取图片
image = cv2.imread(args["image"])
# 定义边界列表 (lower[r, g, b], upper[r, g, b])
boundaries = [    ([17, 15, 100], [50, 56, 200]),    ([86, 31, 4], [220, 88, 50]),    ([25, 146, 190], [62, 174, 250]),    ([103, 86, 65], [145, 133, 128])]
img_mask = []
# 循环遍历所有的边界
for (lower, upper) in boundaries:   
 	# 创建上边界和下边界    
	 lower = np.array(lower, dtype = "uint8")    
	 upper = np.array(upper, dtype = "uint8")
   	 # 在指定边界内查找颜色并应用掩码    
   	 mask = cv2.inRange(image, lower, upper)    
   	 # 进行与操作    
   	 output = cv2.bitwise_and(image, image, mask = mask); img_mask.append(output)
    # 显示结果    
    cv2.imshow("images", np.hstack([image, output]))    
    cv2.waitKey(0)
imageio.mimsave("mask.gif", img_mask)

四、算法运行流程

  1. 打开一个cmd界面或者打开其它的工具;
  2. cd /d xxx 切换到代码路径,xxx表示代码的具体路径;
  3. python detect_color.py -i img1.png 执行代码;
  4. 依次按下Enter键来观察结果。

五、效果展示与分析

  下图展示的是算法的输出结果,算法迭代着依次输出红色、蓝色、黄色和灰色的目标,满足了我们预期的要求。
在这里插入图片描述
在这里插入图片描述

六、思维扩展

  该算法的思路和实现都很简单,效果也不错,不足之处是我们需要根据目标提前设置相应的lower和upper参数值,而这两个值严重的影响着该算法的性能,那么我们可不可以应用一种自动的方法来获得这两个值呢,使得整个算法变成全自动化的,这个问题留给大家自己去思考!!!

参考资料

[1] 参考链接-参考链接

注意事项

[1] 如果您对AI、自动驾驶、AR、ChatGPT等技术感兴趣,欢迎关注我的微信公众号“AI产品汇”,有问题可以在公众号中私聊我!
[2] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家的关注.
[3] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[4] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[5] 本文测试的图片可以通过关注微信公众号AI产品汇之后找我索取!
[6] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊!!!

  • 9
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要实现红绿灯的识别和处理,可以使用Python中的OpenCV库。以下是一个简单的示例: 1. 首先,导入必要的库: ```python import cv2 import numpy as np ``` 2. 读取摄像头或视频文件: ```python cap = cv2.VideoCapture(0) # 读取摄像头 # cap = cv2.VideoCapture("video.mp4") # 读取视频文件 ``` 3. 循环读取每一帧图像: ```python while True: ret, frame = cap.read() # 读取一帧图像 if not ret: # 读取失败,退出循环 break # 在这里添加红绿灯识别和处理的代码 cv2.imshow("frame", frame) # 显示图像 key = cv2.waitKey(1) # 等待按键,1毫秒 if key == ord("q"): # 按下q键,退出循环 break ``` 4. 红绿灯识别和处理: 首先,需要将图像转换为HSV颜色空间,这样可以更方便地提取颜色信息。然后,使用cv2.inRange函数提取红色和绿色的区域,得到二值化图像。接着,使用cv2.findContours函数查找轮廓,并根据轮廓的大小和位置判断红绿灯的状态。 ```python # 将图像转换为HSV颜色空间 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 提取红色和绿色的区域 lower_red = np.array([0, 70, 50]) upper_red = np.array([10, 255, 255]) mask_red1 = cv2.inRange(hsv, lower_red, upper_red) lower_red = np.array([170, 70, 50]) upper_red = np.array([180, 255, 255]) mask_red2 = cv2.inRange(hsv, lower_red, upper_red) mask_red = cv2.bitwise_or(mask_red1, mask_red2) lower_green = np.array([40, 70, 50]) upper_green = np.array([80, 255, 255]) mask_green = cv2.inRange(hsv, lower_green, upper_green) # 查找轮廓 contours_red, hierarchy_red = cv2.findContours(mask_red, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) contours_green, hierarchy_green = cv2.findContours(mask_green, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 判断红绿灯状态 if len(contours_red) > 0 and len(contours_green) == 0: # 红灯 cv2.putText(frame, "RED", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) elif len(contours_red) == 0 and len(contours_green) > 0: # 绿灯 cv2.putText(frame, "GREEN", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) else: # 其他情况,比如黄灯或者没有灯 cv2.putText(frame, "UNKNOWN", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 2) ``` 5. 最后,释放摄像头或视频文件,并关闭所有窗口: ```python cap.release() cv2.destroyAllWindows() ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值