[PYTHON] So zeichnen Sie ein OpenCV-Bild mit Pygame

Wenn Sie OpenCV in Python ausführen und die Ergebnisse der Analyse und Verarbeitung anzeigen möchten, ist es am einfachsten, die Methode cv2.imshow () zu verwenden. Wenn Sie jedoch mehr als nur anzeigen möchten, reicht das OpenCV-Fenster nicht aus. Eine Möglichkeit, dieses Problem zu lösen, ist die Verwendung von Pygame, dem Python-GUI-Framework [^ Pygame Reasons to Choose]. In diesem Beitrag werde ich darüber schreiben, wie OpenCV-Bilder in Bilder für Pygame konvertiert werden.

[Grund für die Wahl von ^ Pygame]: Der Grund für Pygame ist, dass es auch mit Raspbian Lite gezeichnet werden kann (super wichtig). Die meisten GUI-Frameworks (einschließlich der OpenCV-Fensterfunktionalität) basieren auf dem X Window System und können auf Raspbian Lite ohne integrierte GUI nicht angezeigt werden. Pygame kann jedoch auch mit SDL zeichnen, sodass es auch mit Raspbian Lite funktioniert.

Umgebung

Hardware
Raspberry Pi 3 Model B+
OS
Raspbian Buster Lite / 2019-09-26
Python
3.7.3
OpenCV
3.2.0
Pygame
1.9.4.post1

Installationsbefehl

#Melden Sie sich nach dem Schreiben des Betriebssystems mit ssh an

#Paketliste aktualisieren
sudo apt update

#Installieren Sie OpenCV für Python3
sudo apt install python3-opencv

#Installieren Sie Pygame für Python 3
sudo apt install python3-pygame

#Überprüfen Sie die Python-Version
python3 --version

#Überprüfen Sie die Version von OpenCV
python3 -c 'import cv2; print(cv2.__version__)'

#Überprüfen Sie die Version von Pygame
python3 -c 'import pygame; print(pygame.version.ver)'

Wie man es im Web findet

Laut "Zeichne ein mit opencv erstelltes Bild mit Pygame. --BlankTar" ist es wie folgt. Es scheint, dass es durch die Methode konvertiert werden kann.

opencv_image = opencv_image[:,:,::-1]  #Da OpenCV BGR und Pygame RGB ist, muss es konvertiert werden.
shape = opencv_image.shape[1::-1]  #OpenCV(Höhe,Breite,Anzahl der Farben), Pygame(Breite, Höhe)Das wird also auch konvertiert.
pygame_image = pygame.image.frombuffer(opencv_image.tostring(), shape, 'RGB')

Schreiben wir den Code, um ihn auf diese Weise zu konvertieren.

show-image.py


import time

import cv2
import pygame


def get_opencv_img_res(opencv_image):
    height, width = opencv_image.shape[:2]
    return width, height

def convert_opencv_img_to_pygame(opencv_image):
    """
Konvertieren Sie OpenCV-Bilder für Pygame.

    see https://blanktar.jp/blog/2016/01/pygame-draw-opencv-image.html
    """
    opencv_image = opencv_image[:,:,::-1]  #Da OpenCV BGR und Pygame RGB ist, muss es konvertiert werden.
    shape = opencv_image.shape[1::-1]  #OpenCV(Höhe,Breite,Anzahl der Farben), Pygame(Breite, Höhe)Das wird also auch konvertiert.
    pygame_image = pygame.image.frombuffer(opencv_image.tostring(), shape, 'RGB')

    return pygame_image

def main():
    #Laden Sie Bilder mit OpenCV
    image_path = '/usr/share/info/gnupg-module-overview.png'  #Der Pfad der Bilddatei, die ursprünglich in Raspbian Buster Lite enthalten war
    opencv_image = cv2.imread(image_path)

    #Pygame initialisieren
    pygame.init()
    width, height = get_opencv_img_res(opencv_image)
    screen = pygame.display.set_mode((width, height))

    #Konvertieren Sie OpenCV-Bilder für Pygame
    pygame_image = convert_opencv_img_to_pygame(opencv_image)

    #Zeichne ein Bild
    screen.blit(pygame_image, (0, 0))
    pygame.display.update()  #Bildschirm aktualisieren

    #Warten Sie 5 Sekunden, bis Sie fertig sind
    time.sleep(5)
    pygame.quit()


if __name__ == '__main__':
    main()

Befehl starten


sudo python3 show-image.py
# Note:Sie müssen "sudo" hinzufügen und mit Root-Rechten ausführen, um es mithilfe der SDL-Bibliothek anzuzeigen.
#"Mit Desktop" -Version von Raspbian, die nicht Lite ist, und "ssh-Befehl"-Wenn Sie beispielsweise eine Verbindung mit der hinzugefügten Option "X" herstellen,
#Es ist kein "sudo" -Befehl erforderlich, da er mit dem X Window System angezeigt werden kann.
#       see https://www.subthread.co.jp/blog/20181206/

Wenn Sie es starten, wird das Bild 5 Sekunden lang angezeigt und es wird automatisch beendet. Die Konvertierung funktioniert korrekt.

Konvertierungsgeschwindigkeit

Betrachten wir nun den Fall, dass das analysierte Video mit der oben beschriebenen Methode in Echtzeit angezeigt wird. Solche Anwendungen werden häufig verwendet, beispielsweise beim Analysieren und Anzeigen von Bildern, die von einer Kamera gelesen wurden. In diesem Fall ist die Konvertierungsgeschwindigkeit wichtig. Lassen Sie uns messen.

show-image.py


import time

import cv2
import pygame


def get_opencv_img_res(opencv_image):
    height, width = opencv_image.shape[:2]
    return width, height

def convert_opencv_img_to_pygame(opencv_image):
    """
Konvertieren Sie OpenCV-Bilder für Pygame.

    see https://blanktar.jp/blog/2016/01/pygame-draw-opencv-image.html
    """
    opencv_image = opencv_image[:,:,::-1]  #Da OpenCV BGR und Pygame RGB ist, muss es konvertiert werden.
    shape = opencv_image.shape[1::-1]  #OpenCV(Höhe,Breite,Anzahl der Farben), Pygame(Breite, Höhe)Das wird also auch konvertiert.
    pygame_image = pygame.image.frombuffer(opencv_image.tostring(), shape, 'RGB')

    return pygame_image

def main():
    #Laden Sie Bilder mit OpenCV
    image_path = '/usr/share/info/gnupg-module-overview.png'  #Der Pfad der Bilddatei, die ursprünglich in Raspbian Buster Lite enthalten war
    opencv_image = cv2.imread(image_path)

    #Pygame initialisieren
    pygame.init()
    width, height = get_opencv_img_res(opencv_image)
    screen = pygame.display.set_mode((width, height))

    #Konvertieren Sie OpenCV-Bilder für Pygame
    time_start = time.perf_counter()  #Messung starten
    pygame_image = convert_opencv_img_to_pygame(opencv_image)
    time_end = time.perf_counter()  #Ende der Messung
    print(f'Umwandlungszeit: {time_end - time_start}Sekunden/ {1/(time_end - time_start)}fps')

    #Zeichne ein Bild
    screen.blit(pygame_image, (0, 0))
    pygame.display.update()  #Bildschirm aktualisieren

    #Warten Sie 5 Sekunden, bis Sie fertig sind
    time.sleep(5)
    pygame.quit()


if __name__ == '__main__':
    main()
Umwandlungszeit: 0.14485926300017127 Sekunden/ 6.903252020540914fps

**langsam! !! !! ** ** **

0,14 Sekunden mit einem Code, der nur angezeigt wird. Wenn Sie 7 fps in Bezug auf die Bildrate schreiben, können Sie diese Langsamkeit erkennen.

Ist dies die Grenze von OpenCV + Pygame? Nein, ist es nicht. Ich mache es einfach falsch. Der Grund, warum es so langsam ist, ist, dass die Bilddaten durch die Methode "tostring ()" absichtlich in eine Zeichenfolge konvertiert werden. Wie Sie anhand der Messung sehen können, sind 90% dieses Gewichts auf die Methode "tostring ()" zurückzuführen.

Schneller

Die eigentlichen Bilddaten von OpenCV für Python sind NumPys ndarray. Pygame hat eine Funktion, die Bilddaten aus einem Array von NumPy liest. Wie Sie dies voll ausnutzen können, finden Sie unter "OpenCV VideoCapture läuft unter PyGame".

frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = np.rot90(frame)
frame = pygame.surfarray.make_surface(frame)

In Kommentarbereich von "OpenCV VideoCapture läuft auf PyGame" wird die Lösung des durch diese Methode verursachten Bildinversionsproblems + weitere Beschleunigung beschrieben Wird auch beschrieben.

 frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
-frame = np.rot90(frame)
+frame = frame.swapaxes(0,1)
 frame = pygame.surfarray.make_surface(frame)

Wechseln Sie zu dieser Methode und messen Sie erneut.

show-image.py


import time

import cv2
import pygame


def get_opencv_img_res(opencv_image):
    height, width = opencv_image.shape[:2]
    return width, height

def convert_opencv_img_to_pygame(opencv_image):
    """
Konvertieren Sie OpenCV-Bilder für Pygame.

    see https://gist.github.com/radames/1e7c794842755683162b
    """
    rgb_image = cv2.cvtColor(opencv_image, cv2.COLOR_BGR2RGB).swapaxes(0, 1)
    #Generieren Sie eine Oberfläche zum Zeichnen von Bildern mit Pygame basierend auf OpenCV-Bildern
    pygame_image = pygame.surfarray.make_surface(rgb_image)

    return pygame_image

def main():
    #Laden Sie Bilder mit OpenCV
    image_path = '/usr/share/info/gnupg-module-overview.png'  #Der Pfad der Bilddatei, die ursprünglich in Raspbian Buster Lite enthalten war
    opencv_image = cv2.imread(image_path)

    #Pygame initialisieren
    pygame.init()
    width, height = get_opencv_img_res(opencv_image)
    screen = pygame.display.set_mode((width, height))

    #Konvertieren Sie OpenCV-Bilder für Pygame
    time_start = time.perf_counter()  #Messung starten
    pygame_image = convert_opencv_img_to_pygame(opencv_image)
    time_end = time.perf_counter()  #Ende der Messung
    print(f'Umwandlungszeit: {time_end - time_start}Sekunden/ {1/(time_end - time_start)}fps')

    #Zeichne ein Bild
    screen.blit(pygame_image, (0, 0))
    pygame.display.update()  #Bildschirm aktualisieren

    #Warten Sie 5 Sekunden, bis Sie fertig sind
    time.sleep(5)
    pygame.quit()


if __name__ == '__main__':
    main()
Umwandlungszeit: 0.030075492999912967 Sekunden/ 33.24966277370395fps

Es hat sich sehr verbessert.

Graustufenbilder zeichnen

Nachdem das Geschwindigkeitsproblem verbessert wurde, sehen wir uns das Ergebnis einer Aktion mit OpenCV an. Angenommen, Sie möchten das binärisierte Ergebnis anzeigen.

show-image.py


import time

import cv2
import pygame


def get_opencv_img_res(opencv_image):
    height, width = opencv_image.shape[:2]
    return width, height

def convert_opencv_img_to_pygame(opencv_image):
    """
Konvertieren Sie OpenCV-Bilder für Pygame.

    see https://gist.github.com/radames/1e7c794842755683162b
    """
    rgb_image = cv2.cvtColor(opencv_image, cv2.COLOR_BGR2RGB).swapaxes(0, 1)
    #Generieren Sie eine Oberfläche zum Zeichnen von Bildern mit Pygame basierend auf OpenCV-Bildern
    pygame_image = pygame.surfarray.make_surface(rgb_image)

    return pygame_image

def main():
    #Laden Sie Bilder mit OpenCV
    image_path = '/usr/share/info/gnupg-module-overview.png'  #Der Pfad der Bilddatei, die ursprünglich in Raspbian Buster Lite enthalten war
    opencv_image = cv2.imread(image_path)

    #Bild verarbeiten
    opencv_gray_image = cv2.cvtColor(opencv_image, cv2.COLOR_BGR2GRAY)
    ret, opencv_threshold_image = cv2.threshold(opencv_gray_image, 128, 255, cv2.THRESH_BINARY)
    opencv_image = opencv_threshold_image

    #Pygame initialisieren
    pygame.init()
    width, height = get_opencv_img_res(opencv_image)
    screen = pygame.display.set_mode((width, height))

    #Konvertieren Sie OpenCV-Bilder für Pygame
    pygame_image = convert_opencv_img_to_pygame(opencv_image)

    #Zeichne ein Bild
    screen.blit(pygame_image, (0, 0))
    pygame.display.update()  #Bildschirm aktualisieren

    #Warten Sie 5 Sekunden, bis Sie fertig sind
    time.sleep(5)
    pygame.quit()


if __name__ == '__main__':
    main()

Die Ausführung schlägt jedoch mit folgendem Fehler fehl:

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor, file /build/opencv-L65chJ/opencv-3.2.0+dfsg/modules/imgproc/src/color.cpp, line 9716
Traceback (most recent call last):
  File "show-image.py", line 51, in <module>
    main()
  File "show-image.py", line 39, in main
    pygame_image = convert_opencv_img_to_pygame(opencv_image)
  File "show-image.py", line 17, in convert_opencv_img_to_pygame
    rgb_image = cv2.cvtColor(opencv_image, cv2.COLOR_BGR2RGB).swapaxes(0, 1)
cv2.error: /build/opencv-L65chJ/opencv-3.2.0+dfsg/modules/imgproc/src/color.cpp:9716: error: (-215) scn == 3 || scn == 4 in function cvtColor

Das binärisierte Bild ist ein Graustufenbild ohne Farbkomponenten. Bei der Konvertierung in ein Bild für Pygame gibt es jedoch einen Code, der die Farbe des Eingabebilds von BGR in RGB konvertiert. Daher tritt in diesem Teil ein Fehler auf.

Um dieses Problem zu lösen, ist für Graustufenbilder ein Verzweigungsprozess erforderlich, um das zweite Argument der Methode "cv2.cvtColor ()" in "cv2.COLOR_GRAY2RGB" zu ändern.

show-image.py


import time

import cv2
import pygame


def get_opencv_img_res(opencv_image):
    height, width = opencv_image.shape[:2]
    return width, height

def convert_opencv_img_to_pygame(opencv_image):
    """
Konvertieren Sie OpenCV-Bilder für Pygame.

    see https://gist.github.com/radames/1e7c794842755683162b
    see https://github.com/atinfinity/lab/wiki/%5BOpenCV-Python%5D%E7%94%BB%E5%83%8F%E3%81%AE%E5%B9%85%E3%80%81%E9%AB%98%E3%81%95%E3%80%81%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E6%95%B0%E3%80%81depth%E5%8F%96%E5%BE%97
    """
    if len(opencv_image.shape) == 2:
        #Für Graustufenbilder
        cvt_code = cv2.COLOR_GRAY2RGB
    else:
        #In anderen Fällen:
        cvt_code = cv2.COLOR_BGR2RGB
    rgb_image = cv2.cvtColor(opencv_image, cvt_code).swapaxes(0, 1)
    #Generieren Sie eine Oberfläche zum Zeichnen von Bildern mit Pygame basierend auf OpenCV-Bildern
    pygame_image = pygame.surfarray.make_surface(rgb_image)

    return pygame_image

def main():
    #Laden Sie Bilder mit OpenCV
    image_path = '/usr/share/info/gnupg-module-overview.png'  #Der Pfad der Bilddatei, die ursprünglich in Raspbian Buster Lite enthalten war
    opencv_image = cv2.imread(image_path)

    #Bild verarbeiten
    opencv_gray_image = cv2.cvtColor(opencv_image, cv2.COLOR_BGR2GRAY)
    ret, opencv_threshold_image = cv2.threshold(opencv_gray_image, 128, 255, cv2.THRESH_BINARY)
    opencv_image = opencv_threshold_image

    #Pygame initialisieren
    pygame.init()
    width, height = get_opencv_img_res(opencv_image)
    screen = pygame.display.set_mode((width, height))

    #Konvertieren Sie OpenCV-Bilder für Pygame
    pygame_image = convert_opencv_img_to_pygame(opencv_image)

    #Zeichne ein Bild
    screen.blit(pygame_image, (0, 0))
    pygame.display.update()  #Bildschirm aktualisieren

    #Warten Sie 5 Sekunden, bis Sie fertig sind
    time.sleep(5)
    pygame.quit()


if __name__ == '__main__':
    main()

Sie sollten jetzt auch ein binärisiertes Graustufenbild sehen können.

Weitere Beschleunigung

[Wenn Sie Bilder derselben Größe und Farbe mehrmals konvertieren, z. B. wenn Sie Kamerabilder kontinuierlich verarbeiten, verwenden Sie "pygame.surfarray.blit_array ()" anstelle der Methode "pygame.surfarray.make_surface ()" Sie können es mit der Methode `(https://stackoverflow.com/a/42589544/4907315) beschleunigen.

Lassen Sie uns zunächst die herkömmliche Methode zur Verwendung der Methode "pygame.surfarray.make_surface ()" für jede Konvertierung messen.

show-image.py


import statistics
import time

import cv2
import pygame


def get_opencv_img_res(opencv_image):
    height, width = opencv_image.shape[:2]
    return width, height

def convert_opencv_img_to_pygame(opencv_image):
    """
Konvertieren Sie OpenCV-Bilder für Pygame.

    see https://gist.github.com/radames/1e7c794842755683162b
    see https://github.com/atinfinity/lab/wiki/%5BOpenCV-Python%5D%E7%94%BB%E5%83%8F%E3%81%AE%E5%B9%85%E3%80%81%E9%AB%98%E3%81%95%E3%80%81%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E6%95%B0%E3%80%81depth%E5%8F%96%E5%BE%97
    """
    if len(opencv_image.shape) == 2:
        #Für Graustufenbilder
        cvt_code = cv2.COLOR_GRAY2RGB
    else:
        #In anderen Fällen:
        cvt_code = cv2.COLOR_BGR2RGB
    rgb_image = cv2.cvtColor(opencv_image, cvt_code).swapaxes(0, 1)
    #Generieren Sie eine Oberfläche zum Zeichnen von Bildern mit Pygame basierend auf OpenCV-Bildern
    pygame_image = pygame.surfarray.make_surface(rgb_image)

    return pygame_image

def main():
    #Laden Sie Bilder mit OpenCV
    image_path = '/usr/share/info/gnupg-module-overview.png'  #Der Pfad der Bilddatei, die ursprünglich in Raspbian Buster Lite enthalten war
    opencv_image = cv2.imread(image_path)

    #Pygame initialisieren
    pygame.init()
    width, height = get_opencv_img_res(opencv_image)
    screen = pygame.display.set_mode((width, height))

    #Konvertieren Sie OpenCV-Bilder für Pygame
    time_diff_list = []
    for _ in range(500):
      time_start = time.perf_counter()  #Messung starten
      pygame_image = convert_opencv_img_to_pygame(opencv_image)
      time_end = time.perf_counter()  #Ende der Messung
      time_diff_list.append(time_end - time_start)
    time_diff = statistics.mean(time_diff_list)
    print(f'Durchschnittliche Konvertierungszeit: {time_diff}Sekunden/ {1/time_diff}fps')

    #Zeichne ein Bild
    screen.blit(pygame_image, (0, 0))
    pygame.display.update()  #Bildschirm aktualisieren

    #Warten Sie 1 Sekunde und beenden Sie
    time.sleep(1)
    pygame.quit()


if __name__ == '__main__':
    main()
Durchschnittliche Konvertierungszeit: 0.01808052065800075 Sekunden/ 55.30814177950641fps

Es ist so schnell wie eine Annäherung an 60 fps. Das ist immer noch schnell genug, aber es ist ein bisschen nervig, wenn Sie denken, Sie konvertieren nur.

Als nächstes messen wir die Beschleunigungsmethode mit der Methode pygame.surfarray.blit_array ().

show-image.py


import statistics
import time

import cv2
import pygame


def get_opencv_img_res(opencv_image):
    height, width = opencv_image.shape[:2]
    return width, height

pygame_surface_cache = {}

def convert_opencv_img_to_pygame(opencv_image):
    """
Konvertieren Sie OpenCV-Bilder für Pygame.

    see https://gist.github.com/radames/1e7c794842755683162b
    see https://github.com/atinfinity/lab/wiki/%5BOpenCV-Python%5D%E7%94%BB%E5%83%8F%E3%81%AE%E5%B9%85%E3%80%81%E9%AB%98%E3%81%95%E3%80%81%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E6%95%B0%E3%80%81depth%E5%8F%96%E5%BE%97
    see https://stackoverflow.com/a/42589544/4907315
    """
    if len(opencv_image.shape) == 2:
        #Für Graustufenbilder
        cvt_code = cv2.COLOR_GRAY2RGB
    else:
        #In anderen Fällen:
        cvt_code = cv2.COLOR_BGR2RGB
    rgb_image = cv2.cvtColor(opencv_image, cvt_code).swapaxes(0, 1)

    #Holen Sie sich eine generierte Oberfläche aus dem Cache mit derselben Bildgröße
    cache_key = rgb_image.shape
    cached_surface = pygame_surface_cache.get(cache_key)

    if cached_surface is None:
        #Generieren Sie eine Oberfläche zum Zeichnen von Bildern mit Pygame basierend auf OpenCV-Bildern
        cached_surface = pygame.surfarray.make_surface(rgb_image)
        #Oberfläche zum Cache hinzufügen
        pygame_surface_cache[cache_key] = cached_surface
    else:
        #Wenn Sie eine Oberfläche mit derselben Bildgröße finden, verwenden Sie die bereits generierte Oberfläche erneut.
        pygame.surfarray.blit_array(cached_surface, rgb_image)

    return cached_surface

def main():
    #Laden Sie Bilder mit OpenCV
    image_path = '/usr/share/info/gnupg-module-overview.png'  #Der Pfad der Bilddatei, die ursprünglich in Raspbian Buster Lite enthalten war
    opencv_image = cv2.imread(image_path)

    #Pygame initialisieren
    pygame.init()
    width, height = get_opencv_img_res(opencv_image)
    screen = pygame.display.set_mode((width, height))

    #Konvertieren Sie OpenCV-Bilder für Pygame
    time_diff_list = []
    for _ in range(500):
      time_start = time.perf_counter()  #Messung starten
      pygame_image = convert_opencv_img_to_pygame(opencv_image)
      time_end = time.perf_counter()  #Ende der Messung
      time_diff_list.append(time_end - time_start)
    time_diff = statistics.mean(time_diff_list)
    print(f'Durchschnittliche Konvertierungszeit: {time_diff}Sekunden/ {1/time_diff}fps')

    #Zeichne ein Bild
    screen.blit(pygame_image, (0, 0))
    pygame.display.update()  #Bildschirm aktualisieren

    #Warten Sie 1 Sekunde und beenden Sie
    time.sleep(1)
    pygame.quit()


if __name__ == '__main__':
    main()
Durchschnittliche Konvertierungszeit: 0.013679669161995207 Sekunden/ 73.1011830884182fps

Es hat 60fps überschritten! Wenn es so schnell ist, wird es praktisch genug sein.

So konvertieren Sie OpenCV-Bilder für Pygame

def convert_opencv_img_to_pygame(opencv_image):
    """
Konvertieren Sie OpenCV-Bilder für Pygame.

    see https://gist.github.com/radames/1e7c794842755683162b
    see https://github.com/atinfinity/lab/wiki/%5BOpenCV-Python%5D%E7%94%BB%E5%83%8F%E3%81%AE%E5%B9%85%E3%80%81%E9%AB%98%E3%81%95%E3%80%81%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E6%95%B0%E3%80%81depth%E5%8F%96%E5%BE%97
    """
    if len(opencv_image.shape) == 2:
        #Für Graustufenbilder
        cvt_code = cv2.COLOR_GRAY2RGB
    else:
        #In anderen Fällen:
        cvt_code = cv2.COLOR_BGR2RGB
    rgb_image = cv2.cvtColor(opencv_image, cvt_code).swapaxes(0, 1)
    #Generieren Sie eine Oberfläche zum Zeichnen von Bildern mit Pygame basierend auf OpenCV-Bildern
    pygame_image = pygame.surfarray.make_surface(rgb_image)

    return pygame_image

Wenn Sie Bilder derselben Größe immer wieder konvertieren möchten:

pygame_surface_cache = {}

def convert_opencv_img_to_pygame(opencv_image):
    """
Konvertieren Sie OpenCV-Bilder für Pygame.

    see https://gist.github.com/radames/1e7c794842755683162b
    see https://github.com/atinfinity/lab/wiki/%5BOpenCV-Python%5D%E7%94%BB%E5%83%8F%E3%81%AE%E5%B9%85%E3%80%81%E9%AB%98%E3%81%95%E3%80%81%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E6%95%B0%E3%80%81depth%E5%8F%96%E5%BE%97
    see https://stackoverflow.com/a/42589544/4907315
    """
    if len(opencv_image.shape) == 2:
        #Für Graustufenbilder
        cvt_code = cv2.COLOR_GRAY2RGB
    else:
        #In anderen Fällen:
        cvt_code = cv2.COLOR_BGR2RGB
    rgb_image = cv2.cvtColor(opencv_image, cvt_code).swapaxes(0, 1)

    #Holen Sie sich eine generierte Oberfläche aus dem Cache mit derselben Bildgröße
    cache_key = rgb_image.shape
    cached_surface = pygame_surface_cache.get(cache_key)

    if cached_surface is None:
        #Generieren Sie eine Oberfläche zum Zeichnen von Bildern mit Pygame basierend auf OpenCV-Bildern
        cached_surface = pygame.surfarray.make_surface(rgb_image)
        #Oberfläche zum Cache hinzufügen
        pygame_surface_cache[cache_key] = cached_surface
    else:
        #Wenn Sie eine Oberfläche mit derselben Bildgröße finden, verwenden Sie die bereits generierte Oberfläche erneut.
        pygame.surfarray.blit_array(cached_surface, rgb_image)

    return cached_surface

Referenz

Recommended Posts

So zeichnen Sie ein OpenCV-Bild mit Pygame
So sammeln Sie Bilder in Python
So zeigen Sie Bilder in Djangos Admin an
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
So führen Sie mit OpenCV ein Null-Padding in einer Zeile durch
So zeigen Sie mehrere Bilder einer Galaxie in Kacheln an
So erhalten Sie RGB- und HSV-Histogramme mit OpenCV
[Python] Wie man PCA mit Python macht
Umgang mit Sitzungen in SQLAlchemy
Verwendung von Klassen in Theano
Wie man nüchtern mit Pandas schreibt
So aktualisieren Sie Spyder in Anaconda
Verwendung von SQLite in Python
So installieren Sie OpenCV auf einem Mac
So konvertieren Sie 0,5 in 1056964608 auf einmal
Wie man CSS in Django reflektiert
Wie man MySQL mit Python benutzt
So verpacken Sie C in Python
Verwendung von ChemSpider in Python
Verwendung von PubChem mit Python
So führen Sie TensorFlow 1.0-Code in 2.0 aus
So rufen Sie PyTorch in Julia an
So installieren Sie OpenCV in Cloud9 und führen es in Python aus
Verwendung berechneter Spalten in CASTable
[Einführung in Python] Wie verwende ich eine Klasse in Python?
So unterdrücken Sie Anzeigefehler in matplotlib
Dynamisches Definieren von Variablen in Python
So machen Sie R chartr () in Python
Wenden Sie verschiedene Formen von Mosaiken auf Bilder an (Python, OpenCV).
So zeichnen Sie ein Diagramm mit Matplotlib
So konvertieren Sie csv in tsv in CLI
So löschen Sie abgelaufene Sitzungen in Django
[Itertools.permutations] So löschen Sie eine Sequenz in Python
So implementieren Sie einen verschachtelten Serializer mit drf-flex-Feldern
So arbeiten Sie mit BigQuery in Python
So führen Sie Befehle mit einem Jupyter-Notebook aus
Wie man in GitPython '--gags fetch --tags' macht
Wie bekomme ich Stacktrace in Python?
So zeigen Sie die neunundneunzig Tabelle in Python an
So weisen Sie den Index im Pandas-Datenrahmen neu zu
Verwendung von Anacondas Interpreter mit PyCharm
Umgang mit aufeinanderfolgenden Werten in MySQL
So wechseln Sie die Python-Version in Cloud9
So passen Sie den Bildkontrast in Python an
Verwendung von __slots__ in der Python-Klasse
Wie man relativ einfach Gesichtsbilder sammelt
So füllen Sie mit Python dynamisch Nullen aus
Verwendung regulärer Ausdrücke in Python
So verwenden Sie Map in ViewPager von Android
So zeigen Sie Hello World in Python an
Lesen von CSV-Dateien mit Pandas
So ändern Sie die Editorfarbe in PyCharm
Wie schreibe ich diesen Prozess in Perl?
Verwendung ist und == in Python
So beleben Sie Zellen in iPython Notebook wieder
So verschieben Sie das BufferImageStim-Objekt in PsychoPy
Verstehen, wie Bilder auf Jupyter angezeigt werden (Verwendung von imshow / matplotlib von OpenCV)
So fügen Sie OpenCV in Raspberry Pi ein und sammeln mit Python ganz einfach Bilder von Gesichtserkennungsergebnissen