我使用opencv在灰度图像上训练级联分类器来检测对象,然后在不同的颜色空间(图像最初是彩色的)上测试检测并计算精度/召回率/谐波平均值。
我想知道为什么我得到相同的结果灰度和RGB,但在其他色彩空间不同?
# Read the image
image = cv2.imread(imagePath)
# convert to grayscale (default algorithm)
if colorspace == "gray":
colorCVT = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
elif colorspace == "hsv":
colorCVT = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
elif colorspace == "hls":
colorCVT = cv2.cvtColor(image, cv2.COLOR_BGR2HLS)
elif colorspace == "lab":
colorCVT = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
elif colorspace == "luv":
colorCVT = cv2.cvtColor(image, cv2.COLOR_BGR2LUV)
elif colorspace == "yuv":
colorCVT = cv2.cvtColor(image, cv2.COLOR_BGR2YUV)
elif colorCVT --"rgb"
colorspace = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
else:
colorCVT = image
print('using color mode: '+colorspace)
with open(outputFilename, 'a') as results:
results.write("Running detection on image: "+imagePath +"n")
results.write("Detecting using trained classifier: "+cascadePath +"n")
# results.close()
# training PARAMS
SCALE_FACTOR = 1.02
MIN_NEIGHBORS = 5
MIN_SIZE = (10,10)
MAX_SIZE = (128,128)
# Detect objects in the image
objects = trainedCascade.detectMultiScale(
colorCVT,
scaleFactor=SCALE_FACTOR,
minNeighbors=MIN_NEIGHBORS,
minSize=MIN_SIZE,
maxSize=MAX_SIZE,
flags = cv2.cv.CV_HAAR_SCALE_IMAGE
)
如果您查看detectMultiScale的API,您将看到它期望图像为灰度。我假设如果它遇到3通道图像(无论是BGR, HSV还是其他),它会首先尝试转换为灰度。
不幸的是,当呈现3通道图像时,OpenCV无法知道该图像使用的是哪个颜色空间,因为没有元数据来指示这样的事情。即使在必须同时指定源和目标颜色空间的cvtColor
调用中,这种限制也很明显。因此,在detectMultiScale
的3通道图像参数的情况下,它似乎总是猜测RGB(或BGR?你在BGR2RGB上的代码似乎有bug)作为颜色空间,当然,只有当这实际上是颜色空间时,这才是正确的。