【问题标题】:Color detection using Python & OpenCV使用 Python 和 OpenCV 进行颜色检测
【发布时间】:2021-11-24 22:29:51
【问题描述】:

是否可以以这样的方式自定义此代码,以便在框架中存在特定颜色时打印某些内容,或者如果框架中未检测到颜色则打印其他内容?如果没有,那么我该如何开发此功能?有什么建议?我只是计算机视觉的初学者 和图像处理。谢谢。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    width = int(cap.get(3))
    height = int(cap.get(4))

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    lower_blue = np.array([90, 50, 50])
    upper_blue = np.array([130, 255, 255])

    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    result = cv2.bitwise_and(frame, frame, mask=mask)

    cv2.imshow('frame', result)
    cv2.imshow('mask', mask)

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

cap.release()
cv2.destroyAllWindows()

【问题讨论】:

    标签: python opencv colors color-detection


    【解决方案1】:

    我认为你可以在你的面具上使用区域道具:

    for region in regionprops(mask):
        # take regions with large enough areas
        if region.area >= 20:
            print("color")
        else:
            print("no color")
    
    

    这样的事情应该可以工作。我使用 20 作为区域区域,但您必须根据您的使用情况尝试最佳价值。 此代码甚至可以检测存在多少颜色区域

    【讨论】:

      【解决方案2】:

      以下方法可能有效:

      import numpy as np
      import cv2
      
      cap = cv2.VideoCapture(0)
      
      while True:
          ret, frame = cap.read()
          width = int(cap.get(3))
          height = int(cap.get(4))
      
          hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
          # only one colour in range:
          lower_blue = np.array([90, 50, 50])
          upper_blue = np.array([90, 50, 50])
          included = False
          mask = cv2.inRange(hsv, lower_blue, upper_blue)
          for i in range(mask.shape[0]):
               for j in range(mask.shape[1]):
                    if mask[i,j] == 1:
                         included = True
      
          if included == True:
              print("colour is included")
          else:
              print("colour is not included")
          result = cv2.bitwise_and(frame, frame, mask=mask)
      
          cv2.imshow('frame', result)
          cv2.imshow('mask', mask)
      
          if cv2.waitKey(1) == ord('q'):
              break
      
      cap.release()
      cv2.destroyAllWindows()
      

      【讨论】:

      • 你真的不应该用 for 这样的循环遍历所有像素 - 这是对 CPU 和时间的巨大浪费。请改用countNonZero(),或numpy.count_nonzero()
      • 这将检测给定颜色的任何像素。我认为最好有一个最小检测区域(嗯,取决于 OP)
      • @MarkSetchell 是的,完全正确,我不知道 countNonZero() 函数,谢谢!
      • 请问作为一个编程初学者,如何获得一个有权对问题发表评论的帐户?我试图尽我所能回答这个问题,当然这并不完美,但我想这是可行的,而且我只会得到反对票……我只是在等待我的帐户被阻止,因为反对票太多等等:D
      • 你会到达那里...继续练习,继续阅读,继续学习。我们曾经都是新人,即使有经验,我们仍然会犯错误。
      【解决方案3】:

      你可以像这样打印彩色

      import os
      
      os.system('')
      #Red: \33[31m
      #Green: \033[1;32;40m
      #Reset color: \033[0;37;40m
      
      print('\033[1;32;40mHello everyone.\033[0;37;40m')
      print("\33[31mBrooo this is red and so susy i think.\033[0;37;40m\n")
      

      【讨论】:

      • 我认为您可能误读了这个问题。它是关于使用 OpenCV 在视频流中寻找颜色。
      猜你喜欢
      • 2021-12-25
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多