首页 > 解决方案 > 从列表中操作连接的变量名称

问题描述

在 Python 3 中,我想用它opencv来研究一些实时网络摄像头镜头。我已经定义了几种颜色,如下所示(我认为回答这个问题没有必要运行下面的代码,这需要一些包和一个网络摄像头,但我保持不变,因为可能是特殊的变量/对象我要定义的“类型”):

import cv2
from imutils.video import VideoStream
import imutils
import numpy as np
from collections import OrderedDict 

colors = ["red", "blue", "green", "yellow", "orange"]
dict = {}
cap = cv2.VideoCapture(0)

# Red color
low_red = np.array([170,100,100]) #50-90: green
high_red = np.array([179,255,255])
# Blue color
low_blue = np.array([80,100,100])
high_blue = np.array([120,255,255])
# Green color
low_green = np.array([50,100,100]) #50-90: green
high_green = np.array([75,255,255])
# Orange color
low_orange = np.array([5,100,100]) #50-90: green
high_orange = np.array([15,255,255])
# Yellow color
low_yellow = np.array([22,100,100]) #50-90: green
high_yellow = np.array([35,255,255])

while True:
    _, frame = cap.read()

    hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

到目前为止,我已经为每种颜色定义了如下颜色蒙版:

    red_mask = cv2.inRange(hsv_frame,low_red,high_red)
    red = cv2.bitwise_and(frame, frame, mask=red_mask)

    blue_mask = cv2.inRange(hsv_frame,low_blue,high_blue)
    blue = cv2.bitwise_and(frame, frame, mask=blue_mask)

    green_mask = cv2.inRange(hsv_frame,low_green,high_green)
    green = cv2.bitwise_and(frame, frame, mask=green_mask)

    orange_mask = cv2.inRange(hsv_frame,low_orange,high_orange)
    orange = cv2.bitwise_and(frame, frame, mask=orange_mask)

    yellow_mask = cv2.inRange(hsv_frame,low_yellow,high_yellow)
    yellow = cv2.bitwise_and(frame, frame, mask=yellow_mask)

但是由于

我需要一个方法,为color上面列表中的每一个创建新的变量/数组/对象,名称为low_red,high_redred_mask。下面,前三行是我目前为每种颜色所拥有的;后一部分是我想要实现的。

    red_mask = cv2.inRange(hsv_frame, low_red, high_red)
    red_mask = cv2.erode(red_mask, None, iterations=1)
    red_mask = cv2.dilate(red_mask, None, iterations=1)

    for color in colors:
        str(color)+"_mask" = cv2.inRange(hsv_frame, eval("low_"+color), eval("high_"+color))
        str(color)+"_mask" = cv2.erode(color_mask, None, iterations=1)
        str(color)+"_mask" = cv2.dilate(color_mask, None, iterations=1)

如上例所示,我尝试了函数的不同用途eval()

我还在互联网上找到了很多关于使用字典的参考资料,包括这个网站;但它们从未以新创建的变量的名称使用,仅在content中使用,我无法根据这些示例解决我的问题。

标签: pythondictionaryvariablesdynamicnaming-conventions

解决方案


首先,您可以创建一个字典来包含所有低值和高值,然后您可以创建一个字典来包含各种颜色蒙版:

colors = {
    'red': (np.array([170,100,100]), np.array([179,255,255])),
    # add other colors here
}

color_masks = {}
for color, (low, high) in colors.items():
    mask = cv2.inRange(hsv_frame, low, high)
    mask = cv2.erode(mask, None, iterations=1)
    mask = cv2.dilate(mask, None, iterations=1)
    color_masks[color] = mask

推荐阅读