为什么我的计数器报告意外值?
why is my counter reporting unexpected values?
我以为我理解 python 中的全局变量作用域。
但是我的柜台没有提供我所期望的。
我使用 opencv 事件来捕获鼠标点击和释放,我只想在变量为 1 时写入输出,所以我需要它符合预期。
已报告警告:
SyntaxWarning: name 'roicounter' is assigned to before global declaration
SyntaxWarning: name 'imgcounter' is assigned to before global declaration
预期输出
imgcounter: 1
roicounter: 1
imgcounter: 1
roicounter: 2
imgcounter: 2
roicounter: 1
imgcounter: 2
roicounter: 2
收到输出(roicounter 严格随时间增加)
roidcounter before reset: 0
roidcounter after reset: 0
roidcounter before increment on any event: 0
roidcounter after increment: 1
1
roidcounter before increment: 1
roidcounter after increment: 2
2
roidcounter before increment: 2
roidcounter after increment: 3
3
收到的输出:绘制一个矩形后:
imgcounter: 1
roidcounter after buttonup (if > 1): 262
roidcounter before increment: 262
roidcounter after increment: 263
263
代码
import cv2
import glob
refPt = []
cropping = False
outputfil = "labels.txt"
global imgcounter, roidcounter
imgcounter = 0
roidcounter = 0
def click_and_crop(event, x, y, flags, param):
global refPt, cropping, imgcounter, roidcounter
print("roidcounter before increment: "+str(roidcounter))
roidcounter+=1
print("roidcounter after increment: "+str(roidcounter))
print(roidcounter)
if event == cv2.EVENT_LBUTTONDOWN:
refPt = [(x, y)]
cropping = True
elif event == cv2.EVENT_LBUTTONUP:
refPt.append((x, y))
cropping = False
# draw a rectangle around the region of interest
cv2.rectangle(image, refPt[0], refPt[1], (0, 255, 0), 2)
cv2.imshow("image", image)
print("imgcounter: "+str(imgcounter))
# write to output
if roidcounter > 1:
print("roidcounter after buttonup (if > 1): "+str(roidcounter))
else:
print("othet stuff")
print("roidcounter after buttonup (else): "+str(roidcounter))
#write roi data
fils=glob.glob("*.jpg")
for fil in fils:
print("inloop")
imgcounter+=1
print("roidcounter before reset: "+str(roidcounter))
roidcounter = 0
print("roidcounter after reset: "+str(roidcounter))
globalfil = fil
#write to output
image = cv2.imread(fil)
clone = image.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", click_and_crop)
while True:
cv2.imshow("image", image)
key = cv2.waitKey(1) & 0xFF
if key == ord("r"):
image = clone.copy()
elif key == ord("c"):
break
cv2.destroyAllWindows()
基于缩进,files=glob.glob("*.jpg")
行及其后的所有内容都是主代码块的一部分,而不是函数定义的一部分。 for file in files:
后不需要 global roicounter, imgcounter
。删除它,看看它是否有帮助。 (为了便于阅读,您可能想在函数定义之间添加一些空 lines/spacing。)
roicounter 也随着鼠标移动而增加。
增量应该在事件条件中。
def click_and_crop(event, x, y, flags, param):
global refPt, cropping, imgcounter, roidcounter
print("roidcounter before increment: "+str(roidcounter))
# roidcounter+=1 // shouldnt be incrmentd here cos of mouse move event.
print("roidcounter after increment: "+str(roidcounter))
print(roidcounter)
if event == cv2.EVENT_LBUTTONDOWN:
refPt = [(x, y)]
cropping = True
elif event == cv2.EVENT_LBUTTONUP:
# now increment roicounter
refPt.append((x, y))
cropping = False
我以为我理解 python 中的全局变量作用域。
但是我的柜台没有提供我所期望的。
我使用 opencv 事件来捕获鼠标点击和释放,我只想在变量为 1 时写入输出,所以我需要它符合预期。
已报告警告:
SyntaxWarning: name 'roicounter' is assigned to before global declaration
SyntaxWarning: name 'imgcounter' is assigned to before global declaration
预期输出
imgcounter: 1
roicounter: 1
imgcounter: 1
roicounter: 2
imgcounter: 2
roicounter: 1
imgcounter: 2
roicounter: 2
收到输出(roicounter 严格随时间增加)
roidcounter before reset: 0
roidcounter after reset: 0
roidcounter before increment on any event: 0
roidcounter after increment: 1
1
roidcounter before increment: 1
roidcounter after increment: 2
2
roidcounter before increment: 2
roidcounter after increment: 3
3
收到的输出:绘制一个矩形后:
imgcounter: 1
roidcounter after buttonup (if > 1): 262
roidcounter before increment: 262
roidcounter after increment: 263
263
代码
import cv2
import glob
refPt = []
cropping = False
outputfil = "labels.txt"
global imgcounter, roidcounter
imgcounter = 0
roidcounter = 0
def click_and_crop(event, x, y, flags, param):
global refPt, cropping, imgcounter, roidcounter
print("roidcounter before increment: "+str(roidcounter))
roidcounter+=1
print("roidcounter after increment: "+str(roidcounter))
print(roidcounter)
if event == cv2.EVENT_LBUTTONDOWN:
refPt = [(x, y)]
cropping = True
elif event == cv2.EVENT_LBUTTONUP:
refPt.append((x, y))
cropping = False
# draw a rectangle around the region of interest
cv2.rectangle(image, refPt[0], refPt[1], (0, 255, 0), 2)
cv2.imshow("image", image)
print("imgcounter: "+str(imgcounter))
# write to output
if roidcounter > 1:
print("roidcounter after buttonup (if > 1): "+str(roidcounter))
else:
print("othet stuff")
print("roidcounter after buttonup (else): "+str(roidcounter))
#write roi data
fils=glob.glob("*.jpg")
for fil in fils:
print("inloop")
imgcounter+=1
print("roidcounter before reset: "+str(roidcounter))
roidcounter = 0
print("roidcounter after reset: "+str(roidcounter))
globalfil = fil
#write to output
image = cv2.imread(fil)
clone = image.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", click_and_crop)
while True:
cv2.imshow("image", image)
key = cv2.waitKey(1) & 0xFF
if key == ord("r"):
image = clone.copy()
elif key == ord("c"):
break
cv2.destroyAllWindows()
基于缩进,files=glob.glob("*.jpg")
行及其后的所有内容都是主代码块的一部分,而不是函数定义的一部分。 for file in files:
后不需要 global roicounter, imgcounter
。删除它,看看它是否有帮助。 (为了便于阅读,您可能想在函数定义之间添加一些空 lines/spacing。)
roicounter 也随着鼠标移动而增加。 增量应该在事件条件中。
def click_and_crop(event, x, y, flags, param):
global refPt, cropping, imgcounter, roidcounter
print("roidcounter before increment: "+str(roidcounter))
# roidcounter+=1 // shouldnt be incrmentd here cos of mouse move event.
print("roidcounter after increment: "+str(roidcounter))
print(roidcounter)
if event == cv2.EVENT_LBUTTONDOWN:
refPt = [(x, y)]
cropping = True
elif event == cv2.EVENT_LBUTTONUP:
# now increment roicounter
refPt.append((x, y))
cropping = False