我正在使用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
)
答案 0 :(得分:2)
如果查看API for detectMultiScale,您会发现它希望图像为灰度。我假设如果它遇到3通道图像(无论是BGR,HSV还是其他),它会尝试先转换为灰度。
不幸的是,当呈现3通道图像时,OpenCV无法知道该图像正在使用哪个色彩空间,因为没有元数据来指示这样的事物。即使在cvtColor
调用中您必须同时指定源和目标颜色空间,此限制也很明显。因此,对于detectMultiScale
的3通道图像参数,它似乎总是猜测RGB(或者可能是BGR?你的BGR2RGB上的代码似乎有些错误)作为颜色空间,当然这只是正确的,如果是实际上是颜色空间。