【问题标题】:How to correctly test RGB values using images(OpenCV & Python)?如何使用图像(OpenCV 和 Python)正确测试 RGB 值?
【发布时间】:2015-03-13 15:33:36
【问题描述】:

我目前正在开发一个使用颜色检测 (OpenCV) 的项目。我对 Python 和 OpenCV 很陌生,所以我并没有完全按照我的意愿工作。

我有一个类 ColourDetection(对 HSV 值进行微调有什么建议吗?),它包含我们用来检测某种颜色的静态方法 detect_color。这里是:

#!/usr/bin/env python
import  cv2
import  numpy   as  np

class ColourDetection(object):

    #HSV 180-255-255 max values openCV (recalculate from GIMP)
    #these need adjusting
    BOUNDARIES = {
    'red': ([170, 160, 60], [180, 255, 255]),
    'blue': ([110, 50, 50], [130, 255, 255]),
    'green': ([38, 50, 50], [75, 255, 255]),
    'yellow':([103, 50, 50], [145, 255, 255])
    }

    @staticmethod
    def detect_color(detection_image):
        img_hsv =   cv2.cvtColor(detection_image,   cv2.COLOR_BGR2HSV)
        #loop for all defined colours
        for k,v in ColourDetection.BOUNDARIES.iteritems():
            #convert to numpy arrays
            lower_color = np.array(v[0])
            upper_color = np.array(v[1])
            #create mask from colour bounds
            mask    =   cv2.inRange(img_hsv,    lower_color,    upper_color)
            #count found colour pixels
            amount_not_zero = cv2.countNonZero(mask)
            if amount_not_zero > 9000:
                return k
            else:
                return "No colour found"

前 2 个测试工作正常。然而,最后一个测试应该使用这些 RGB 值返回红色。看来我需要对 HSV 值进行一些微调。谁能帮帮我?

from unittest import TestCase
from ColourDetection import ColourDetection
import numpy as np

__author__ = 'user'


class TestColourDetection(TestCase):
    def test_detect_color_not_found(self):
        image = np.zeros((512, 512, 3), np.uint8)
        color = ColourDetection.detect_color(image)
        self.assertEqual("No colour found", color)

    def test_detect_color_is_red(self):
        image = np.zeros((512, 512, 3), np.uint8)
        image[:,0:512] = (0, 0, 255)
        color = ColourDetection.detect_color(image)
        self.assertEqual("red", color)

    def test_detect_color_is_blue(self):
        image = np.zeros((512, 512, 3), np.uint8)
        image[:,0:512] = (255, 0, 0)
        color = ColourDetection.detect_color(image)
        self.assertEqual("blue", color)

def test_detect_color_is_green(self):
    image = np.zeros((512, 512, 3), np.uint8)
    image[:,0:512] = (0, 255, 0)
    color = ColourDetection.detect_color(image)
    self.assertEqual("green", color)

def test_detect_color_is_yellow(self):
    image = np.zeros((512, 512, 3), np.uint8)
    image[:,0:512] = (0, 255, 255)
    color = ColourDetection.detect_color(image)
    self.assertEqual("yellow", color)

【问题讨论】:

  • 我发现它可以使用:image[:,0:512] = (0, 0, 100)。尽管如此,我仍然可以获得一些关于这是否是最好的方法的反馈吗?
  • OpenCV 默认颜色空间是 BGR。一般使用cv2.cvtColor(detection_image, cv2.COLOR_BGR2HSV)。尽管在您的示例中您手动执行此操作,但您应该可以使用cv2.COLOR_RGB2HSV
  • 我将其更改为 cv2.COLOR_BGR2HSV 并为其他颜色添加了更多单元测试,但我唯一开始工作的两个是蓝色和黑色。所以我想我需要一些帮助来调整数组中的 HSV 值
  • 根据upload.wikimedia.org/wikipedia/commons/thumb/a/ad/HueScale.svg/… 例如,绿色约为 120。所以假设从 H = 100 到 H = 140。现在 OpenCV 将 H 值除以 2 以适应 360 度到 0..255 字节范围(所以 0..180 色调值)。因此,将您的范围设置为 H = 50 到 H = 70 以检测绿色。 S 和 V 值理论上可以是任何值,但可能您必须忽略太低的值。
  • 出于某种原因,天知道为什么,我无法让它检测到红色、绿色或黄色。我只能让它检测蓝色(使用我的测试方法)。我用 BGR 值辗转反侧,根据你的计算计算色调。但可悲的是它没有工作。我还查看了 OpenCV 中基本颜色的色调值并尝试了这些值,但这也不起作用。为了确定我也让它向我显示图像,100% 确定我正在创建的图像是红色或蓝色等。

标签: python image opencv numpy rgb


【解决方案1】:

您只检测到蓝色的原因可能是因为您的 detect_color 函数中存在错误。

@staticmethod
def detect_color(detection_image):
    for k,v in ColourDetection.BOUNDARIES.iteritems():
    # . . .
        if amount_not_zero > 9000:
            return k
        else:
            return "No colour found"

请注意,您将始终在对 k,v 对的第一次迭代中返回一个值。

也就是说,要么是 iteritems() 为您提供的第一个 k,要么是“未找到颜色”。

【讨论】:

    猜你喜欢
    • 2020-05-28
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多