2015-07-30 6 views
0

Привет, мне было интересно, возможно ли это вообще, поскольку я попробовал, но моя переменная всегда была пустой. В моем проекте я отслеживаю статический объект и лазерную указку через PiCamera на моем малине pi, и я вычисляю центроиды их контуров как (smallx,smally) и (small2x,small2y) соответственно.Невозможно назначить значение переменной python

Я использую разницу между их координатами, чтобы увидеть, должен ли указатель идти вверх, вниз, влево или вправо, чтобы встретить 1-й статический объект. После этого он выберет направление между 1 и 4, чтобы двигаться, потому что мои элементы управления не идеально расположены на оси x-y и наклонены.

Я оставил элементы управления и контур, узнав отсюда, и сократил свой общий код только для того, чтобы вас не встретили гигантскую кучу провалов, чтобы разобраться.

EDIT: Я не думаю, что с моим пониманием я мог бы обеспечить что-то runnable, не отправляя несколько сотен строк и мое маленькое устройство, но я закипи его и отправлю точную часть моего кода, где это актуально , Запуск Python 2.7.3, используя opencv2.4.10

Код:

#import libraries like picamera and opencv 
#set empty variables like: 
up = down = left = right = set() 
smallx = smally = small2x = small2y = 0 
#etc etc 

with picamera.PiCamera() as camera: 
    with picamera.array.PiRGBArray(camera) as rawCapture: 

    #Calibrate my controls with the camera. updates the up, down, left, and right sets. 


with picamera.PiCamera() as camera: 
    with picamera.array.PiRGBArray(camera) as rawCapture: 

    # Take pictures, threshold them, find contours, append their arrays to list 

    if len(cnts)>0:  #If any objects were identified 
      contm = sorted(smalList, key=lambda tup: tup[1]) 
      smallest = cnts[smalList[0][0]]   #**Take smallest object(my static object)** 

      smallM = cv2.moments(smallest)      
      smallx = int(smallM['m10']/smallM['m00']) #**Calculate xcoord** 
      smally = int(smallM['m01']/smallM['m00']) #**Calculate ycoord** 

      cv2.line(frame, (smallx,smally), (smallx,smally), 1, 8,0) #Draws centroid 

      # print(len(cnts)) 

      if len(cnts)==2:  #If only 2 objects were identified 
       smallester = cnts[smalList[1][0]]  #** Take pointer object ** 
       small2 = cv2.moments(smallester)       
       small2x = int(small2['m10']/small2['m00']) #**Calculate xcoord** 
       small2y = int(small2['m01']/small2['m00']) #**Calculate ycoord** 

       x = small2x - smallx 
       y = small2y - smally 

       print x #These prints return a value 
       print y 


       if x < 0:      #Difference = Pointer - Object 
        s1 = right 

       if x >0: 
        s1 = left 

       if y < 0: 
        s2 = down 
       if y >0: 
        s2 = up 
       print s1, s2     #set([]),set([]) 
       print up,down,left,right  #set([1,2]),set([3,4]),set([1,4]),set([2,3]) 

       selecty = s1&s2    #set([]) 


    #Tell the pointer where to go 

Должен ли я быть даже с помощью наборов?

+4

Если 's1' и' s2' всегда остаются '0', то ни одно из ваших условий' if' не оценивает true-y. Из того, что вы опубликовали, мы не можем сказать вам, почему. Но, конечно, можно назначить набор, * он достигает этих строк *. – jonrsharpe

+0

'small2x, smallx = 5,3' –

+0

' set (1, 2) '' 'TypeError'. Вы имели в виду 'set ([1, 2])' или '{1, 2}' вместо этого? –

ответ

0

Использовать s1 = s2 = set() вместо = 0.

Что касается вашего второго вопроса, возможно, есть более эффективные и более известные способы решения вашей проблемы. Например, использование битовой логики:

right = 1 
up = 2 
left = 4 
down = 8 

select = 0 


if (small2x - smallx) < 0: 
    select |= right 
if (small2x - smallx) >0: 
    select |= left 

if (small2y - smally) < 0: 
    select |= down 
if (small2y - smally) >0: 
    select |= up 

print(select) 
print("You chose %s%s%s%s" %("UP " if select & up else "", 
          "DOWN " if select & down else "", 
          "LEFT " if select & left else "", 
          "RIGHT" if select & right else "")) 


#Do things after 
+0

Является ли оператор | = a + a = Кроме того, после создания 's1 = s2 = set()' edit, я заканчиваю пустым набором вместо 0, поэтому он немного ближе, но как-то все еще не заметен. Я также gt, объект 'set set error 'не имеет атрибута' intersect''. Странно, может быть, я буду использовать вместо этого. –

+0

это потому, что это не 'intersect', это' intersection'. 'A | = b', равное' a = a | b' является поразрядным оператором 'or'; в этом случае он установит биты '' '' 1', если соответствующий бит в 'b' равен 1. Например' 51 | 80' становится '115', потому что' 0110011 | 1010000 = 1110011' – Dleep

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