目标跟踪、颜色识别(inRange 如何寻找目标HSV值)

inRange函数可以用来做什么?

       目标跟踪、颜色识别。

       inRange应用过程中,重要的就是找到合适的HSV值。

       在颜色空间人们听得最多的是RGB,它也是计算机色彩的自然表示,但对于人类来说,HSV颜色空间更符合人类的感知。HSV(色相饱和度值):

H(Hue):色调,取值范围是 [0,179] ,它用来限制某一个颜色的彩色光谱范围;

S(Saturation):饱和度,取值范围是 [0,255] ,它用来限制颜色的深度,值越大颜色越深;

V(Value):色值,取值范围是 [0,255] ,它用来限制像素的亮度,值越大像素越亮。

那如何找到合适的颜色跟踪阈值?

首先读取一张所要跟踪的图片:

import cv2
import imutils

frame = cv2.imread("UAV.jpg")
frame = imutils.resize(frame, width=320)  #调整一下图片大小
cv2.imshow('frame', frame)
cv2.waitKey(0)

说明:cv2.waitKey(0) 是一个键盘绑定函数,若不使用该函数,imshow图像即闪即退(或者说是显示不出来)。输出摄像头或视 频时,应指定一个大于0的参数。cv2.waitKey(10):等待10毫秒播放下一帧。

        可以看到图像左下角,有显示对应坐标及对应坐标的RGB值。图像中选用了红色蓝色卡纸作为目标来识别跟踪无人机,选用两张卡纸的目的是标注无人机pitch的正负,也可以说是无人机的头和尾,同时还可以得到无人机与目标点的角度值,从而可以控制yaw。

       然后将鼠标放到红色和蓝色卡纸上,得到对应的RGB值,记录下来。(红色:251,136,191      蓝色:153,217,211)

计算得到对应的HSV:

import cv2
import numpy as np

color=np.uint8([[[191 ,136 ,251]]])
hsv_color=cv2.cvtColor(color,cv2.COLOR_BGR2HSV)

print(hsv_color)

说明:opencv是以BGR格式读取图片的,所以要将得到的RGB值倒着输入。

得到HSV:红色:166,117,251     蓝色:87 ,75,217

可以分别用 [H-50 50? 50] 和 [H+50 255?  255] 做上下阈?值(根据实际情况调整,背景干扰少时范围可放宽一些,背景干扰多时范围限制严格一点,但要确保得到的HSV在上下阈值内)

import cv2
import numpy as np
import imutils


frame = cv2.imread("UAV.jpg")
frame = imutils.resize(frame, width=320)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

mask_red = cv2.inRange(hsv, np.array((110., 50., 50)), np.array((180., 255., 255.)))
mask_red = cv2.medianBlur(mask_red, 3)
cnts_red = cv2.findContours(mask_red.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts_red = cnts_red[0] if imutils.is_cv2() else cnts_red[1]

mask_blue = cv2.inRange(hsv, np.array((40., 50., 50.)), np.array((140., 255., 255.)))
mask_blue = cv2.medianBlur(mask_blue, 3)
cnts_blue = cv2.findContours(mask_blue.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts_blue = cnts_blue[0] if imutils.is_cv2() else cnts_blue[1]

if (len(cnts_red) > 0):
    area = [cv2.contourArea(i) for i in cnts_red]
    index = np.argmax(area)
    rect_red = cv2.minAreaRect(cnts_red[index])
    box_red = np.int0(cv2.boxPoints(rect_red))
    cv2.drawContours(frame, [box_red], 0, (0, 0, 255), 2)

if (len(cnts_blue) > 0):
    area = [cv2.contourArea(i) for i in cnts_blue]
    index = np.argmax(area)
    rect_blue = cv2.minAreaRect(cnts_blue[index])
    box_blue = np.int0(cv2.boxPoints(rect_blue))
    cv2.drawContours(frame, [box_blue], 0, (0, 0, 255), 2)

cv2.imshow('frame', frame)
cv2.imshow('mask_red', mask_red)
cv2.imshow('mask_blue', mask_blue)

cv2.waitKey(0)



       可以看到,由于单片机是暗红色的,在提取红色时受到了干扰,需要再缩小一点范围。计算得到单片机暗红色H值为177,所以我将 mask_red改为cv2.inRange(hsv, np.array((110., 50., 50)), np.array((170., 255., 255.)))。

      至此,测试的对象还只是静态图,当开启摄像头实时跟踪的时候会受到光线的影响,RGB值变化很大,还需要再调节HSV的范围。而且选取目标跟踪颜色时,应选取背景干扰少的颜色。网上也有一张别人测好的HSV范围表可用,我用的效果还蛮好的。

      缺陷:inRange对光比较敏感,跟踪需要特定颜色。如若想对任意目标跟踪,可以使用CAMShift。但CAMShift对运动过快的对象容易跟丢。

其它一些应用:

       摄像头识别黄色条形码,并保存图片:

源码下载:

https://github.com/LNanL/drone

 

 

 

  • 5
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要自动识别图像中目标区域的颜色并用HSV标识,可以使用Python的OpenCV库。下面是一个示例代码,可以帮助你实现这个目标: ```python import cv2 import numpy as np def auto_color_detection(image): # 将图像转换为HSV颜色空间 hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 定义目标颜色的范围(在HSV颜色空间中) lower_color = np.array([0, 50, 50]) # 最低阈 upper_color = np.array([10, 255, 255]) # 最高阈 # 创建一个掩码,将目标颜色范围内的像素设为白色,其他像素设为黑色 mask = cv2.inRange(hsv_image, lower_color, upper_color) # 寻找目标颜色区域的轮廓 contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 标记目标颜色区域,并获取其HSV颜色 for contour in contours: area = cv2.contourArea(contour) if area > 100: # 过滤掉面积较小的区域 x, y, w, h = cv2.boundingRect(contour) cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) hsv_value = hsv_image[y + h // 2, x + w // 2] print("HSV颜色:", hsv_value) # 显示图像 cv2.imshow("Image", image) cv2.waitKey(0) cv2.destroyAllWindows() # 读取图像 image = cv2.imread("image.jpg") # 调用自动颜色识别函数 auto_color_detection(image) ``` 在这段代码中,我们首先将图像转换为HSV颜色空间。然后,我们定义了目标颜色HSV范围,并创建了一个掩码来标记目标颜色区域。接下来,我们使用`cv2.findContours`函数找到目标颜色区域的轮廓,并通过`cv2.rectangle`函数在图像上绘制矩形来标记这些区域。最后,我们获取每个目标颜色区域中心像素的HSV,并打印出来。 确保将代码中的`image.jpg`替换为你要处理的图像文件路径。 请注意,这是一个基本的示例代码,可能无法处理所有情况。你可能需要根据具体的应用场景进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值