繁体   English   中英

Python 元组和 For 循环的标识符问题

[英]Python Identifier Issue with Tuple & For Loop

我目前正在尝试将 (2) 值存储到 2 个 1D 元组中,以供 OpenCV 之后使用。 但是,由于我对 Python 非常陌生,因此我目前在元组标识符方面面临一个相当“简单”的问题。 当我运行以下代码时:

import cv2
import numpy as np
import imutils

cap= cv2.VideoCapture(0)
cap.set(3,640)
cap.set(4,480)

point1 = []
point2 = []

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

     hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

     lower_red = np.array([0,50,120])
     upper_red = np.array([10,255,255])

     lower_yellow = np.array([25,70,120])
     upper_yellow = np.array([30,255,255])

     lower_blue = np.array([90,60,0])
     upper_blue = np.array([121,255,255])

     maskred = cv2.inRange(hsv,lower_red,upper_red)
     maskyellow = cv2.inRange(hsv,lower_yellow,upper_yellow)
     maskblue = cv2.inRange(hsv,lower_blue,upper_blue)

     cntsred = cv2.findContours(maskred, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
     cntsred = imutils.grab_contours(cntsred)

     cntsyellow = cv2.findContours(maskyellow, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
     cntsyellow = imutils.grab_contours(cntsyellow)

     cntsblue = cv2.findContours(maskblue, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
     cntsblue = imutils.grab_contours(cntsblue)

     for c in cntsred:
         areared = cv2.contourArea(c)
         if areared > 5000:


             cv2.drawContours(frame,[c],-1,(0,255,0), 3)

             M = cv2.moments(c)

             cxred = int(M["m10"]/ M["m00"])
             cyred = int(M["m01"]/ M["m00"])

             cv2.circle(frame,(cxred,cyred),7,(255,255,255),-1)
             cv2.putText(frame, "Red", (cxred-20, cyred-20), cv2.FONT_HERSHEY_SIMPLEX, 2.5, (255, 255, 255), 3)
             redcoord = (cxred, cyred)

     for c in cntsyellow:
         areayellow = cv2.contourArea(c)
         if areayellow > 5000:


             cv2.drawContours(frame,[c],-1,(0,255,0), 3)

             M = cv2.moments(c)

             cxyellow = int(M["m10"]/ M["m00"])
             cyyellow = int(M["m01"]/ M["m00"])

             cv2.circle(frame,(cxyellow,cyyellow),7,(255,255,255),-1)
             cv2.putText(frame, "Yellow", (cxyellow-20, cyyellow-20), cv2.FONT_HERSHEY_SIMPLEX, 2.5, (255, 255, 255), 3)
             yellowcoord = (cxyellow, cyyellow)

     cv2.line(frame, redcoord, yellowcoord, (0, 255, 0), 3)   

如图所示,存在以下语法错误。

在此处输入图像描述

我可以检查是否是由于某些缩进或声明问题导致“yellowcoord”元组无法识别?

yellowcoord在 for 循环中的 if 块内定义。 如果 if 块的内容从未运行(即如果areayellow从未大于 5000),则不会定义yellowcoord

您可以通过在循环之前将yellowcoord初始化为 None 来检查这种意外情况,然后在循环之后测试它是否被赋予了另一个值:

yellowcoord = None

for c in cntsyellow:
     areayellow = cv2.contourArea(c)
     if areayellow > 5000:
        ... 
        yellowcoord = (cxyellow, cyyellow) 

if yellowcoord is not None:
    # Now I know I can use yellowcoord safely

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM