2015-10-20 2 views
-2

Я думал, что понял глобальную переменную scope в 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 

Ouput получил: После того, как один прямоугольник вывод:

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. Вы не нуждаетесь в global roicounter, imgcounter после for file in files:. Удалите это и посмотрите, поможет ли он. (Вы можете добавить несколько пустых строк/интервалов между функциями defs, для удобства чтения.)

Смежные вопросы