微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python CV2颜色检测混乱

如何解决Python CV2颜色检测混乱

假设我有下面的图片,我想检测红色。一种可能的方法是找到上限和下限的HSV并添加遮罩:

mask = cv2.inRange(imgHSV,low,high)

为了获取lowhigh的值,这是我要做的:

我首先将获得浅红色像素的RGB值,假设RGB为(112,4,61)。然后,我将使用以下计算器将其转换为HSVhttps://www.rapidtables.com/convert/color/rgb-to-hsv.html

我会得到H = 328 degreesS = 96%V = 44%的HSV。假设上限为H = 350 degrees

enter image description here

对我来说有意义的是:

mask = cv2.inRange(hsv,(328//2,int(0.96 * 255),int(0.44 * 255)),(350/2,255,255))

由于cv2将色相存储为0-180,因此第一次除以2,第二次和第三次是百分比乘以饱和度和值的最大值。

但是,这不能给我正确的答案。我应该要做的是以下事情:

mask = cv2.inRange(hsv,96,44),255))

我不明白。如果计算器说饱和度为96%,饱和度范围为0-255,为什么还要在这里放置96?放入95%中的255才有意义吗?

解决方法

这在Python / OpenCV中对我有效。我测得的HSV值为226deg,220,85。因此在OpenCV中为113,220,85。我对S,V应用15%的正负值,对H应用60%的正负。我认为您用来将RGB转换为HSV的工具是错误的,或者您对RGB值的测量存在偏差。您的色相值似乎减少了100。您有328,我有226。也许您在录制时输入错误。

输入:

enter image description here

import cv2
import numpy as np

# Read image
image = cv2.imread('redclock.jpg')

# Convert to HSV
hsv = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)

# Define lower and uppper limits
# +-15% of S and V,+-60 on H
#226,85 => 226/2,86%,33% = 113,0.86*255,0.33*255
lower = np.array([(113-60),int((0.86-0.15)*255),int((0.33-0.15)*255)])
upper = np.array([(113+60),int((0.86+0.14)*255),int((0.33+0.15)*255)])

# Create mask to only select white
thresh = cv2.inRange(hsv,lower,upper)

# save results
cv2.imwrite('redclock_thresh.jpg',thresh)

cv2.imshow('thresh',thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。