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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...