#python #opencv #kivy
#python #opencv #kivy
Вопрос:
Я интегрирую проект компьютерного зрения в kivy framework, чтобы его можно было использовать на устройствах Android. Проект посвящен определению живости, он инструктирует вас поворачивать голову, улыбаться, моргать и т.д. Он действительно отлично работает в OpenCV, но мне нужно интегрировать его в kivy framework. Я нашел этот пример в kivy, думая, что это похоже на мою проблему.
from kivy.app import App
from kivy.uix.image import Image
from kivy.clock import Clock
from kivy.graphics.texture import Texture
import cv2
class KivyCamera(Image):
def __init__(self, capture, fps, **kwargs):
super(KivyCamera, self).__init__(**kwargs)
self.capture = capture
Clock.schedule_interval(self.update, 1.0 / fps)
def update(self, dt):
faceCascade = cv2.CascadeClassifier("Resources/haarcascades/haarcascade_frontalface_default.xml") # added
ret, frame = self.capture.read()
if ret:
frameGray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # added
faces = faceCascade.detectMultiScale(frameGray, 1.1, 4) # added
for (x, y, w, h) in faces: # added
cv2.rectangle(frame, (x, y), (x w, y h), (255, 0, 0), 2) # added
# convert it to texture
buf1 = cv2.flip(frame, 0)
buf = buf1.tostring()
image_texture = Texture.create(
size=(frame.shape[1], frame.shape[0]), colorfmt='bgr')
image_texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte')
# display image from the texture
self.texture = image_texture
class CamApp(App):
def build(self):
self.capture = cv2.VideoCapture(0)
self.my_camera = KivyCamera(capture=self.capture, fps=30)
return self.my_camera
def on_stop(self):
#without this, app will not exit even if the window is closed
self.capture.release()
if __name__ == '__main__':
CamApp().run()
Это работает очень хорошо, оно распознает лица и помещает квадраты вокруг них.
Моя основная программа задает 4 вопроса, например «моргнуть, улыбнуться», и эти вопросы печатаются на OpenCV camera.
Я попытался интегрировать свой код OpenCV, и функционально он работает, ошибок нет, и я вижу, что он обнаруживает мои движения по отпечаткам на консоли. Проблема в том, что я не могу вывести изображение на экран, он открывает камеру и выдает мне белый экран. Это код:
import imutils
from kivy.app import App
from kivy.uix.image import Image
from kivy.clock import Clock
from kivy.graphics.texture import Texture
import cv2
import random
import f_liveness_detection
import questions
class KivyCamera(Image):
def __init__(self, capture, fps, **kwargs):
super(KivyCamera, self).__init__(**kwargs)
self.capture = capture
Clock.schedule_interval(self.update, 1.0 / fps)
def update(self, dt):
COUNTER, TOTAL = 0, 0
counter_ok_questions = 0
counter_ok_consecutives = 0
limit_consecutives = 3
limit_questions = 4 # 6
counter_try = 0
limit_try = 50
def show_image(text, color=(0, 0, 255)):
ret, im = self.capture.read()
im = imutils.resize(im, width=720)
cv2.putText(im, text, (10, 50), cv2.FONT_HERSHEY_COMPLEX, 1, color, 2)
frame_to_texture(im)
def frame_to_texture(image):
buf1 = cv2.flip(image, 0)
buf = buf1.tostring()
image_texture = Texture.create(
size=(image.shape[1], image.shape[0]), colorfmt='bgr')
image_texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte')
# display image from the texture
self.texture = image_texture
ret, frame = self.capture.read()
for i_questions in range(0, limit_questions):
index_question = random.randint(0, 3)
question = questions.question_bank(
index_question)
show_image(question)
if cv2.waitKey(1) amp; 0xFF == ord('q'):
break
for i_try in range(limit_try):
ret, im = self.capture.read()
im = imutils.resize(im, width=720)
im = cv2.flip(im, 1)
TOTAL_0 = TOTAL
out_model = f_liveness_detection.detect_liveness(im, COUNTER, TOTAL_0)
TOTAL = out_model['total_blinks']
COUNTER = out_model['count_blinks_consecutives']
dif_blink = TOTAL - TOTAL_0
if dif_blink > 0:
blinks_up = 1
else:
blinks_up = 0
challenge_res = questions.challenge_result(question, out_model, blinks_up)
show_image(question)
if cv2.waitKey(1) amp; 0xFF == ord('q'):
break
if challenge_res == "pass":
show_image(question " : basarili") # !!!!!!!
if cv2.waitKey(1) amp; 0xFF == ord('q'):
break
counter_ok_consecutives = 1
if counter_ok_consecutives == limit_consecutives:
counter_ok_questions = 1
counter_try = 0
counter_ok_consecutives = 0
break
else:
continue
elif challenge_res == "fail":
counter_try = 1
show_image(question " : basarisiz")
elif i_try == limit_try - 1:
break
if counter_ok_questions == limit_questions:
while True:
show_image("CANLILIK TESPITI BASARILI", color=(0, 255, 0))
if cv2.waitKey(1) amp; 0xFF == ord('q'):
break
elif i_try == limit_try - 1:
while True:
show_image("CANLILIK TESPITI BASARISIZ")
if cv2.waitKey(1) amp; 0xFF == ord('q'):
break
break
else:
continue
# convert it to texture
buf1 = cv2.flip(frame, 0)
buf = buf1.tostring()
image_texture = Texture.create(
size=(frame.shape[1], frame.shape[0]), colorfmt='bgr')
image_texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte')
# display image from the texture
self.texture = image_texture
class CamApp(App):
def build(self):
self.capture = cv2.VideoCapture(0)
self.my_camera = KivyCamera(capture=self.capture,
fps=30)
return self.my_camera
def on_stop(self):
self.capture.release()
if __name__ == '__main__':
CamApp().run()
Я много чего перепробовал, но, похоже, не могу с этим справиться. Любая помощь будет высоко оценена.
Комментарии:
1. используйте
print()
для просмотра того, что у вас есть в переменных. ИЛИ узнайте, как использовать настоящий отладчик.2. начните с нуля, создавайте этот код по частям. выясните, что заставляет его перестать работать.
3. На самом деле это работает, я имею в виду, что ошибок нет, и это функциональная программа. Он выводит команды на консоль, камера открывается, и я вижу, что она обнаруживает мои движения по выводам консоли «успешно». Он просто не будет отображаться, есть только белый экран. Я отредактировал код, определив, что необходимо, а что нет. Я добавил методы, чтобы сделать его функциональным, но по-прежнему нет отображения.
4. Привет — есть какие-нибудь успехи с этим? У нас один и тот же код frame_to_texture, и у меня та же проблема, что и у вас. Мой код отлично работал на предыдущем дисплее, и проблема возникла только после того, как я сменил ЖК-дисплей на свой Raspberry Pi.
5. К сожалению, я не смог решить эту проблему. Удачи вам.