Я хотел бы обрезать изображение с помощью этой команды.ошибка кортежа при обрезке
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()
'im' - это захват изображения из функции VideoCapture(), как это может быть кортеж? поскольку я знаю, что «ящик» - это набор кортежей – timekeeper
@timekeeper: ошибка показывает, что это кортеж. Я не знаю, почему, но вы передали кортеж в функцию. Посмотрите на свой код еще раз, более внимательно. – user2357112
Я включил мою полную программу. пожалуйста, проконсультируйтесь, если какая-либо проблема существует – timekeeper