Python-如何在不同的for循环函数中交换两个局部变量?
我正在使用Python3.x和Cascades OpenCV检测我的手,并将其像素坐标发送给Arduino。 当我用一个手势时,一切都很顺利。但是,当我尝试这样使用2时: 1.打开的手->改变X和Z通过左右和上下移动保持Y 2.闭合手->更改Y通过上下移动保持X和Z 它遇到了一些问题,比如全局变量和局部变量 当我试图运行代码时,会发生一些错误,如: 未定义名称“ycenter2” 未定义名称“zcenter1” 未定义名称“xcenter1” 当它们在两个不同的for循环函数中时,如何交换它们的变量,如下所示Python-如何在不同的for循环函数中交换两个局部变量?,python,global-variables,local-variables,Python,Global Variables,Local Variables,我正在使用Python3.x和Cascades OpenCV检测我的手,并将其像素坐标发送给Arduino。 当我用一个手势时,一切都很顺利。但是,当我尝试这样使用2时: 1.打开的手->改变X和Z通过左右和上下移动保持Y 2.闭合手->更改Y通过上下移动保持X和Z 它遇到了一些问题,比如全局变量和局部变量 当我试图运行代码时,会发生一些错误,如: 未定义名称“ycenter2” 未定义名称“zcenter1” 未定义名称“xcenter1” 当它们在两个不同的for循环函数中时,如何交换它们的
ycenter1 = ycenter2
zcenter2 = zcenter1
xcenter2 = xcenter1
我是Python新手,非常感谢你的帮助!非常感谢 您可以同时迭代两个列表,就像这样。所以你可以在ycenter1之前声明ycenter2
我想在第一个for之前放一行:ycenter2=inty2+h2/2+30就行了。Hello@SayandipDutta,这行不通,因为它们不是全局变量,调试人员说它们还没有定义!请提供运行代码时得到的实际错误消息/堆栈跟踪。您好@FiddleStix,我添加了错误消息,谢谢提醒!您正在尝试在第一个for循环中执行ycenter1=ycenter2。正如另一位评论者所提到的,这是因为您尚未声明ycenter2。如果在它之前声明,第一个错误将被修复。我想它也会修复其他错误。这不是假设open\u detect和Closed\u detect的长度相同吗?我相信,如果你压缩两个列表,它将通过zip[],[1,2]快速检查,直到较小的列表结束。。。我看不出它们长度相同的原因,我希望其中一个通常是空的,另一个有一个结果谢谢你的评论,但是当我使用你的代码时,我的手不再被检测到了@le phong,正如Foon所说,你对我的脚本的问题可以在打开的检测列表和关闭的检测列表中有不同的长度。你能提供最低限度的样本数据吗?
ycenter1 = ycenter2
zcenter2 = zcenter1
xcenter2 = xcenter1
while(True):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
Closed_detect = Closed_cascade.detectMultiScale(gray, 1.2, 5)
Opened_detect = Opened_cascade.detectMultiScale(gray, 1.2, 5)
for (x1, y1, w1, h1), (x2, y2, w2, h2) in zip(Opened_detect, Closed_detect):
cv2.rectangle(frame, (x1, y1), (x1 + w1, y1 + h1), (0, 150, 0), 2)
servoPosition = 35
zcenter1 = int(x1 + w1/2)
ycenter2 = int(y2 + h2/2 + 30)
ycenter1 = ycenter2
xcenter1 = int(y1 + h1/2 + 30)
arduinoData.write(struct.pack('>IIII',xcenter1,ycenter1,zcenter1,servoPosition))
cv2.rectangle(frame, (x2, y2), (x2 + w2, y2 + h2), (0, 0, 200), 2)
servoPosition = 5
zcenter2 = zcenter1
xcenter2 = xcenter1
arduinoData.write(struct.pack('>IIII',xcenter2,ycenter2,zcenter2,servoPosition))
cv2.imshow('Webcam', frame)
k = cv2.waitKey(40) & 0xff
if k == 27:
break