2016-11-07 12 views
0

Я пытаюсь создать приложение для каскадного обучения в Python и Kivy, в котором вы можете легко загрузить изображение, увеличить и повернуть изображение с помощью мультитач и указать с двойным касанием объекты, которые я хочу обрезать, чтобы сохранить изображение их в отдельной папке для использования латерана для обучения каскадного классификатора. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я получаю только координаты окна, которые мне не удается преобразовать в координаты изображения, используя to_parant и т. Д. Любое предложение для решения этой проблемы было бы очень желанным!Python - Kivy cascade training: Как получить координаты касания относительно изображения?

if touch.is_double_tap: 
     user_textinput = self.ids['user_textinput'] # change the text in the box where the user can put in the file directory by the created image name 
     image = cv2.imread(user_textinput.text) 
     x = int(touch.x) 
     y = int(touch.y) 
     w_double = 30 
     h_double = 30 

     crop_img = image[x-w_double/2:y-h_double/2, w_double:h_double] # Crop from x, y, w, h 
     cv2.imwrite("positive.jpg", crop_img) 

     cv2.rectangle(image,(x-w_double/2,y-h_double/2),(x+w_double/2,y+h_double/2),(255,255,255),3)    
     feedback_img_dir = 'product_pictures/feedback_' + str(time.strftime("%Y%m%d%H%M%S")) + ".jpg" # create name for image with a time stamp 
     cv2.imwrite(feedback_img_dir, image) 
     print "feedback_img saved as " + feedback_img_dir 

     user_textinput = self.ids['user_textinput'] # change the text in the box where the user can put in the file directory by the created image name 
     user_textinput.text = str(feedback_img_dir) 
    else: 
     return super(GUI, self).on_touch_down(touch) # assures that if noth double click or ... the other withgets can still be used 

ответ

0

To_parent (и друзья) только нужно перейти от одной системы координат в другую, как, когда например RelativeLayout, или используются ScrollView, за исключение того, положение вашего изображения в системе координат, то получить событие касания в, и его положение относительно этого, так что вам просто нужно выставить его положение в положение касания, чтобы получить его относительное.

X, Y = touch.x - image.x, touch.y - image.y

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

+0

Я могу согласиться с тем, что если изображение будет отображаться с масштабом 1, это сработает, но в настоящее время я показываю изображение в режиме рассеяния, чтобы включить масштабирование и вращение двойного касания и трансляцию с одним касанием. Любые предложения о том, как получить правильные координаты в этом случае? – JEPE

+0

Ну, если вы используете Scatter, он уже получает правильное положение, если вы хотите сделать чек в своей системе координат из другого виджета, тогда вам понадобится метод scatter.to_widget(). Тем не менее, я не уверен, что обрезка будет работать так, как вы намереваетесь таким образом, особенно если речь идет о ротации, более полная версия кода поможет, поэтому можно увидеть, как связаны Scatter и код. Лучшим решением может быть использование FBO для отображения текущего состояния разброса в системе координат родителя и обрезание этого. – Tshirtman