如何减少 python 中的多个 if 语句
How to reduce multiple if statement in python
我有以下代码片段:
amountLst = []
for i in range(9):
hsv = ""
if i == 0:
hsv = cv2.cvtColor(barc0Img, cv2.COLOR_BGR2HSV)
elif i == 1:
hsv = cv2.cvtColor(barc1Img, cv2.COLOR_BGR2HSV)
elif i == 2:
hsv = cv2.cvtColor(barc2Img, cv2.COLOR_BGR2HSV)
elif i == 3:
hsv = cv2.cvtColor(barc3Img, cv2.COLOR_BGR2HSV)
elif i == 4:
hsv = cv2.cvtColor(barc4Img, cv2.COLOR_BGR2HSV)
elif i == 5:
hsv = cv2.cvtColor(barc5Img, cv2.COLOR_BGR2HSV)
elif i == 6:
hsv = cv2.cvtColor(barc6Img, cv2.COLOR_BGR2HSV)
elif i == 7:
hsv = cv2.cvtColor(barc7Img, cv2.COLOR_BGR2HSV)
elif i == 8:
hsv = cv2.cvtColor(barc8Img, cv2.COLOR_BGR2HSV)
lower_bound = np.array([0, 80, 80])
upper_bound = np.array([20, 255, 255])
mask = cv2.inRange(hsv, lower_bound, upper_bound)
amountLst.append(mask)
如您所见,我正在检查 i
的值并根据它选择合适的 hsv。有没有更好的方法通过避免多个 if 语句来做到这一点。谢谢
您可以使用包含 barc<int>Img
:
的列表
barcImg = [
barc0Img,
barc1Img,
barc2Img,
...
]
amountLst = []
for i in range(9):
hsv = cv2.cvtColor(barcImg[i], cv2.COLOR_BGR2HSV)
lower_bound = np.array([0, 80, 80])
upper_bound = np.array([20, 255, 255])
mask = cv2.inRange(hsv, lower_bound, upper_bound)
amountLst.append(mask)
首先将您的 barcXImg 引用放入列表中:
barcImages = [barc0Img, barc1Img, barc2Img, barc3Img, barc4Img, barc5Img, barc6Img, barc7Img, barc8Img]
只计算一次上限和下限(因为它们似乎不依赖于其他任何东西):
lo = np.array([0, 80, 80])
hi = np.array([20, 255, 255])
然后您可以通过理解来构建您的列表:
amountLst = [cv2.inRange(cv2.cvtColor(img, cv2.COLOR_BGR2HSV), lo, hi) for img in barcImages]
我建议你创建一个模拟 switch-case
的函数
def switch(argument):
switcher = {
0: cv2.cvtColor(barc0Img, cv2.COLOR_BGR2HSV),
1: cv2.cvtColor(barc1Img, cv2.COLOR_BGR2HSV),
2: cv2.cvtColor(barc2Img, cv2.COLOR_BGR2HSV),
3: cv2.cvtColor(barc3Img, cv2.COLOR_BGR2HSV),
4: cv2.cvtColor(barc4Img, cv2.COLOR_BGR2HSV),
5: cv2.cvtColor(barc5Img, cv2.COLOR_BGR2HSV),
6: cv2.cvtColor(barc6Img, cv2.COLOR_BGR2HSV),
7: cv2.cvtColor(barc7Img, cv2.COLOR_BGR2HSV),
8: cv2.cvtColor(barc8Img, cv2.COLOR_BGR2HSV),
}
return switcher.get(argument, "nothing")
amountLst = []
argument = yourArgument # 0,1,2,3,....
hsv = switch(argument)
lower_bound = np.array([0, 80, 80])
upper_bound = np.array([20, 255, 255])
mask = cv2.inRange(hsv, lower_bound, upper_bound)
amountLst.append(mask)
我有以下代码片段:
amountLst = []
for i in range(9):
hsv = ""
if i == 0:
hsv = cv2.cvtColor(barc0Img, cv2.COLOR_BGR2HSV)
elif i == 1:
hsv = cv2.cvtColor(barc1Img, cv2.COLOR_BGR2HSV)
elif i == 2:
hsv = cv2.cvtColor(barc2Img, cv2.COLOR_BGR2HSV)
elif i == 3:
hsv = cv2.cvtColor(barc3Img, cv2.COLOR_BGR2HSV)
elif i == 4:
hsv = cv2.cvtColor(barc4Img, cv2.COLOR_BGR2HSV)
elif i == 5:
hsv = cv2.cvtColor(barc5Img, cv2.COLOR_BGR2HSV)
elif i == 6:
hsv = cv2.cvtColor(barc6Img, cv2.COLOR_BGR2HSV)
elif i == 7:
hsv = cv2.cvtColor(barc7Img, cv2.COLOR_BGR2HSV)
elif i == 8:
hsv = cv2.cvtColor(barc8Img, cv2.COLOR_BGR2HSV)
lower_bound = np.array([0, 80, 80])
upper_bound = np.array([20, 255, 255])
mask = cv2.inRange(hsv, lower_bound, upper_bound)
amountLst.append(mask)
如您所见,我正在检查 i
的值并根据它选择合适的 hsv。有没有更好的方法通过避免多个 if 语句来做到这一点。谢谢
您可以使用包含 barc<int>Img
:
barcImg = [
barc0Img,
barc1Img,
barc2Img,
...
]
amountLst = []
for i in range(9):
hsv = cv2.cvtColor(barcImg[i], cv2.COLOR_BGR2HSV)
lower_bound = np.array([0, 80, 80])
upper_bound = np.array([20, 255, 255])
mask = cv2.inRange(hsv, lower_bound, upper_bound)
amountLst.append(mask)
首先将您的 barcXImg 引用放入列表中:
barcImages = [barc0Img, barc1Img, barc2Img, barc3Img, barc4Img, barc5Img, barc6Img, barc7Img, barc8Img]
只计算一次上限和下限(因为它们似乎不依赖于其他任何东西):
lo = np.array([0, 80, 80])
hi = np.array([20, 255, 255])
然后您可以通过理解来构建您的列表:
amountLst = [cv2.inRange(cv2.cvtColor(img, cv2.COLOR_BGR2HSV), lo, hi) for img in barcImages]
我建议你创建一个模拟 switch-case
的函数def switch(argument):
switcher = {
0: cv2.cvtColor(barc0Img, cv2.COLOR_BGR2HSV),
1: cv2.cvtColor(barc1Img, cv2.COLOR_BGR2HSV),
2: cv2.cvtColor(barc2Img, cv2.COLOR_BGR2HSV),
3: cv2.cvtColor(barc3Img, cv2.COLOR_BGR2HSV),
4: cv2.cvtColor(barc4Img, cv2.COLOR_BGR2HSV),
5: cv2.cvtColor(barc5Img, cv2.COLOR_BGR2HSV),
6: cv2.cvtColor(barc6Img, cv2.COLOR_BGR2HSV),
7: cv2.cvtColor(barc7Img, cv2.COLOR_BGR2HSV),
8: cv2.cvtColor(barc8Img, cv2.COLOR_BGR2HSV),
}
return switcher.get(argument, "nothing")
amountLst = []
argument = yourArgument # 0,1,2,3,....
hsv = switch(argument)
lower_bound = np.array([0, 80, 80])
upper_bound = np.array([20, 255, 255])
mask = cv2.inRange(hsv, lower_bound, upper_bound)
amountLst.append(mask)