【问题标题】:How to remove nested for loops and use numpy arrays insead如何删除嵌套的 for 循环并使用 numpy 数组 insead
【发布时间】:2019-09-23 10:55:27
【问题描述】:

我有一个包含 580 帧的视频。我需要能够从视频中检测到绿色并创建一个掩码,以便在找到绿色的位置放置零值,其余的应该是 255。我已经将视频转换为 HSV 格式并使用嵌套的 for 循环和它大约需要一个小时才能做到这一点我想知道是否有更快的方法来做到这一点。
这是我当前的代码

for i in range(0, len(temp)):
   temp[i] = cv2.cvtColor(temp[i], cv2.COLOR_BGR2HSV)
for k in range(0, len(temp)):
    for i in range(0, len(temp[k])):
        for j in range(0, len(temp[k][i])):
           if(temp[k][i][j][0] > 50 and temp[k][i][j][0] < 65 and temp[k][i][j][2] > 150):
               temp1[k][i][j][0] = 0
               temp1[k][i][j][1] = 0
               temp1[k][i][j][2] = 0
           else:
               temp1[k][i][j][0] = 255
               temp1[k][i][j][1] = 255
               temp1[k][i][j][2] = 255

temp 是我的 HSV 数组,temp1 是我正在创建的掩码

【问题讨论】:

  • 使用cv2.inRange()查看颜色阈值
  • 我正在寻找一个没有范围内功能的答案,谢谢你的建议
  • 你不想使用cv2.inRange()有什么具体原因吗?这可能是最好的方法,因为它是矢量化的,具有可调节的最小/最大颜色阈值,并且会为您提供一个输出蒙版,其中所需的绿色像素为白色,背景为黑色
  • 这是一个愚蠢的任务的一部分,这就是原因。这就是为什么我将问题标记为完成。因为即使我仍在寻求优化这些循环,但不使用 cv2.inRange 的问题并不是一个非常现实的问题。

标签: python-3.x numpy opencv for-loop numpy-indexing


【解决方案1】:

不是cv2 专家,但如果它像numpy 数组一样工作,那么 . . .

for i in range(0, len(temp)):
   temp[i] = cv2.cvtColor(temp[i], cv2.COLOR_BGR2HSV)
   temp1[i] = (1 - cv2.inRange(temp[i], (50, 0, 150), (65, 255, 255)).astype(int)) * 255

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-10
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多