2014-02-06 3 views
0

Я хотел бы обрезать изображение с помощью этой команды.ошибка кортежа при обрезке

def imgCrop(im): 
     box = (0, 150, 640, 200) 
     region = im.crop(box) 
     region.save('crop.jpg') 
     return region 

то ошибка вышла, как этот

AttributeError: 'tuple' object has no attribute 'crop' 

и фактически им отсылая к http://effbot.org/imagingbook/image.htm, этот метод является правильным. Пожалуйста, порекомендуйте.

Вот моя полная программа, пожалуйста, сообщите

import cv2 
from cv2 import * 
from PIL import Image 
import RPi.GPIO as GPIO 
import time 
im = 0 

GPIO.setwarnings(False) 

GPIO.setmode(GPIO.BCM) 

GPIO.setup(27, GPIO.OUT)  #Input 1 
GPIO.setup(22, GPIO.OUT)  #Input 2 
GPIO.setup(9, GPIO.OUT)   #Input 3 
GPIO.setup(10, GPIO.OUT)  #Input 4 
GPIO.setup(7, GPIO.OUT)   #Enable 1 
GPIO.setup(8, GPIO.OUT)   #Enable 2 

GPIO.setup(15, GPIO.IN)   #turn right 
GPIO.setup(18, GPIO.IN)   #turn left 
GPIO.setup(23, GPIO.IN)   #backward 
GPIO.setup(24, GPIO.IN)   #forward 

p = GPIO.PWM(7,50) 
q = GPIO.PWM(8,50) 
p.start(0) 
q.start(0) 

def forward(): 
    p.ChangeDutyCycle(100) 
    q.ChangeDutyCycle(100) 
    GPIO.output(27, GPIO.HIGH)  #input 1 is LOW 
    GPIO.output(22, GPIO.LOW)  #input 2 is High 
    GPIO.output(9, GPIO.HIGH)  #input 1 is LOW 
    GPIO.output(10, GPIO.LOW)  #input 2 is High 

def backward(): 
    p.ChangeDutyCycle(100) 
    q.ChangeDutyCycle(100) 
    GPIO.output(27, GPIO.LOW)  #input 1 is LOW 
    GPIO.output(22, GPIO.HIGH)  #input 2 is High 
    GPIO.output(9, GPIO.LOW)  #input 1 is LOW 
    GPIO.output(10, GPIO.HIGH)  #input 2 is High 

def left(): 
    p.ChangeDutyCycle(100) 
    q.ChangeDutyCycle(100) 
    GPIO.output(27, GPIO.LOW)  #input 1 is LOW 
    GPIO.output(22, GPIO.HIGH)  #input 2 is High 
    GPIO.output(9, GPIO.HIGH)  #input 1 is LOW 
    GPIO.output(10, GPIO.LOW) 

def right(): 
    p.ChangeDutyCycle(100) 
    q.ChangeDutyCycle(100) 
    GPIO.output(27, GPIO.HIGH)  #input 1 is LOW 
    GPIO.output(22, GPIO.LOW)  #input 2 is High 
    GPIO.output(9, GPIO.LOW)  #input 1 is LOW 
    GPIO.output(10, GPIO.HIGH) 

def stop(): 
    p.ChangeDutyCycle(100) 
    q.ChangeDutyCycle(100) 
    GPIO.output(27, GPIO.LOW)  #input 1 is LOW 
    GPIO.output(22, GPIO.LOW)  #input 2 is High 
    GPIO.output(9, GPIO.LOW)  #input 1 is LOW 
    GPIO.output(10, GPIO.LOW) 

def imgCrop(im): 
     box = (0, 150, 640, 200) 
     region = im.crop(box) 
     region.save('crop.jpg') 
    return region 

def imgThres(im): 
     gray = im.convert('L') 
     bw = gray.point(lambda x: 0 if x<50 else 255, '1') 
     bw.save("bw.jpg") 
    return bw 

def find_centroid(im, rez): 
     width, height = im.size 
     XX, YY, count = 0, 0, 0 
     for x in xrange(0, width, rez): 
      for y in xrange(0, height, rez): 
        if im.getpixel((x, y)) == 255: 
         XX += x 
         YY += y 
         count += 1 
     return XX/count, YY/count 

def camera(): 
    cam = VideoCapture(0) # 0 -> index of camera 
    Img = cam.read() 
    cImg = imgCrop(Img) 
    tImg = imgThres(cImg) 
    print find_centroid(tImg, 1) 

def robo_direct(): 
     cen = find_centroid(tImg, 1) 
     diff = cen[0] - 320 
     if diff > 10: 
     right() 
      print 'right' 
     if diff < -10: 
     left() 
      print 'left' 
     else: 
     forward() 
      print 'straight' 



####---------------------------------------------------------------------------------#### 

forward() 
while True: 
    camera() 
    robo_direct() 

ответ

0

VideoCapture.read не возвращает изображение. Как указано в documentation, он возвращает кортеж retval, image. Не знаю, что такое retval, но это твоя проблема.


im является кортежем. Кортежи не имеют метода crop. Если im не должен быть кортежем, посмотрите, откуда эта функция вызывается, и выясните, почему она передается кортежем.

Кроме того, у вас есть смешанные вкладки и пробелы для отступов. Это может быть или не быть причиной проблем прямо сейчас, но в какой-то момент это будет головной болью. Переключитесь на все вкладки или все пробелы; PEP 8 рекомендует все пробелы.

+0

'im' - это захват изображения из функции VideoCapture(), как это может быть кортеж? поскольку я знаю, что «ящик» - это набор кортежей – timekeeper

+0

@timekeeper: ошибка показывает, что это кортеж. Я не знаю, почему, но вы передали кортеж в функцию. Посмотрите на свой код еще раз, более внимательно. – user2357112

+0

Я включил мою полную программу. пожалуйста, проконсультируйтесь, если какая-либо проблема существует – timekeeper

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