2015-10-20 19 views
-2

我以爲我瞭解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() 
+2

那麼*它給你什麼?你能把代碼縮減到[mcve]嗎?另外,請考慮閱讀[風格指南](https://www.python.org/dev/peps/pep-0008/)。 – jonrsharpe

+0

縮小。感謝您的建議,我總是忘記這一點。 – jsky

+0

另外,我懷疑它可能與事件循環的工作方式有關。但我不知道如何解決它。 – jsky

回答

0

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 
0

基於壓痕,線路files=glob.glob("*.jpg")和一切後,這是你的主代碼塊中的一部分,而不是一部分函數def。您不需要for file in files:之後的global roicounter, imgcounter。刪除它,看看它是否有幫助。 (爲了便於閱讀,您可能需要在函數定義之間添加一些空行/間距)。

相關問題