【问题标题】:OpenCV how to detect a specific color in a frame (inRange function)OpenCV如何检测帧中的特定颜色(inRange函数)
【发布时间】:2018-08-17 09:11:41
【问题描述】:

我可以使用下面的代码在框架内找到任何蓝色的东西:

How To Detect Red Color In OpenCV Python?

但是,我想修改代码以在我拥有的视频中查找非常特定的颜色。我从视频文件中读入一帧,并将帧转换为 HSV,然后在特定元素(包含我要检测的颜色)处打印 HSV 值:

print("hsv[x][y]: {}".format(hsv[x][y]))

“hsv”是我使用 cvtColor() 将帧从 BGR 转换为 HSV 后得到的。 上面的打印命令给了我: hsv[x][y]: [108 27 207]

然后我定义我的 HSV 下限和上限,并将其传递给 inRange() 函数:

lowerHSV = np.array([107,26,206])

upperHSV = np.array([109,28,208])

maskHSV = cv2.inRange(hsv, lowerHSV, upperHSV)

我显示 maskHSV,但它似乎无法识别包含该颜色的项目。我尝试扩展 lowerHSV 和 upperHSV 界限,但这似乎也不起作用。 我尝试使用 BGR 进行类似的操作,但这似乎不起作用。

我试图识别的东西可以最好地描述为柠檬酸运动饮料瓶......

任何建议将不胜感激。

================================================ ======

我正在运行的完整 python 代码如下所示,以及一些相关图像...

import cv2
import numpy as np 
import time

video_capture = cv2.VideoCapture("conveyorBeltShort.wmv") 

xloc = 460

yloc = 60

dCounter = 0

while(1):

    dCounter += 1

    grabbed, frame = video_capture.read()

    if grabbed == False:
        break

    time.sleep(2)

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    lowerBGR = np.array([200,190,180])
    upperBGR = np.array([210,200,190])

    # HSV [108 27 209] observation
    lowerHSV = np.array([105,24,206])
    upperHSV = np.array([111,30,212])

    maskBGR = cv2.inRange(frame, lowerBGR, upperBGR)
    maskHSV = cv2.inRange(hsv, lowerHSV, upperHSV)

    cv2.putText(hsv, "HSV:" + str(hsv[xloc][yloc]),(100,280), 
        cv2.FONT_HERSHEY_SIMPLEX, 3,(0,0,0),8,cv2.LINE_AA)
    cv2.putText(frame, "BGR:" + str(frame[xloc][yloc]),(100,480), 
        cv2.FONT_HERSHEY_SIMPLEX, 3,(0,0,0),8,cv2.LINE_AA)
    cv2.rectangle(frame, (0, 0), (xloc-1, yloc-1), (255, 0, 0), 2)
    cv2.rectangle(hsv, (0, 0), (xloc-1, yloc-1), (255, 0, 0), 2)

    cv2.imwrite("maskHSV-%d.jpg" % dCounter, maskHSV)
    cv2.imwrite("maskBGR-%d.jpg" % dCounter, maskBGR)
    cv2.imwrite("hsv-%d.jpg" % dCounter, hsv) 
    cv2.imwrite("frame-%d.jpg" % dCounter, frame)

    cv2.imshow('frame',frame)
    cv2.imshow('hsv',hsv)
    cv2.imshow('maskHSV',maskHSV)    
    cv2.imshow('maskBGR',maskBGR)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()
video_capture.release()

================================================ ======

第一张图片是“frame-6.jpg”

第二张图片是“hsv-6.jpg”

第三张图片是“maskHSV-6.jpg”

第四张图片是“maskBGR-6.jpg”

maskHSV-6.jpg 和 maskBGR-6.jpg 似乎没有显示传送带上的柠檬酸橙瓶。我相信我的 HSV/BGR 上下限设置正确...

【问题讨论】:

  • 你能提供一些示例图片吗?
  • 结构良好的问题,良好的问题空间定义。我建议您添加一些输入和输出图像,因为它可以帮助我们了解您所获得的内容并可能解决具体问题
  • 感谢您的反馈。我修改了原始帖子以包含我正在运行的整个 python 代码,以及我得到的图像......如果您需要更多信息,请告诉我。

标签: python opencv machine-learning computer-vision opencv3.1


【解决方案1】:

我只知道 C++ 用于 OpenCV,但根据 this post 你应该使用 img[y][x] 或 img[x,y] 来访问像素值。

您的 rgb 值不正确。应该类似于 [96,160,165]

【讨论】:

    猜你喜欢
    • 2017-10-14
    • 2016-06-22
    • 2018-06-15
    • 1970-01-01
    • 2016-10-31
    • 2014-06-25
    • 1970-01-01
    • 2016-09-06
    • 2013-09-09
    相关资源
    最近更新 更多