python - 从列表中操作连接的变量名称
问题描述
在 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_red
等red_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中使用,我无法根据这些示例解决我的问题。
解决方案
首先,您可以创建一个字典来包含所有低值和高值,然后您可以创建一个字典来包含各种颜色蒙版:
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
推荐阅读
- angular - 更新firestore数据后显示重复事件,但firestore中的数据本身不重复
- wordpress - WordPress 将每个页面和文件作为主页
- firebase - Firebase 云消息传递示例不起作用
- vba - 自动筛选不显示现有数据
- apache-camel - Camel bean 组件调用 @Named / @Dependent bean 的缓存实例
- json - Angular 5 无法从 json 正确解析时间戳
- google-cloud-platform - 限制对 GCP Console for Enterprise 的登录访问
- python - py2app 不断将“--iconfile”添加到 DATA_FILES
- javascript - 使用javascript修改基于iframe的HTML DOM
- sql - 如何计算与唯一 ID 有关的值更改的次数?