不同颜色空间的OpenCV检测



我使用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)作为颜色空间,当然,只有当这实际上是颜色空间时,这才是正确的。

相关内容

  • 没有找到相关文章

最新更新