Я могу получить доступ к kivy camera через OpenCV, но нет отображения

#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. К сожалению, я не смог решить эту проблему. Удачи вам.