【问题标题】:why is my counter reporting unexpected values?为什么我的计数器报告意外值?
【发布时间】:2015-10-20 10:09:28
【问题描述】:

我以为我理解了 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()

【问题讨论】:

  • 那么它给了你什么?你能把代码剪成minimal reproducible example吗?另外,请考虑阅读the style guide
  • 缩小。谢谢你的建议,我总是忘记这个。
  • 另外,我怀疑这可能与事件循环的工作方式有关。但我不确定如何解决它。
  • 您可以在增加 roicounter 之前和之后放置一个打印语句吗?我还看到你在循环中为文件中的文件重置了 roicounter ....你能检查一下是否输入过那个循环吗?否则 roicounter 将永远不会被重置...最后使用 fl 或 f 代替 file (但问题可能与此无关)

标签: python scope global counter


【解决方案1】:

基于缩进,files=glob.glob("*.jpg") 行及其后的所有内容都是主代码块的一部分,而不是函数 def 的一部分。在for file in files: 之后不需要global roicounter, imgcounter。删除它,看看它是否有帮助。 (为了便于阅读,您可能希望在函数定义之间添加一些空行/间距。)

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 2019-09-17
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      相关资源
      最近更新 更多