Vidéo 3-bit en console

De Centre de Ressources Numériques - Labomedia
Aller à : Navigation, rechercher

Ce script python permet d'obtenir de la vidéo en 3-bit dans la console. Il fait l'objet d'un article plus détaillé sur Sam & Max.

Nécessite l'installation de python-opencv :

sudo apt-get install python-opencv

Les variables à bidouiller en premier pour des tests sont le seuil, la largeurOut et la hauteurOut.

# -*- coding: utf-8 -*-
# Ce script est diffusé sous les termes de la très sérieuse WTFPL.
# http://fr.wikipedia.org/wiki/WTFPL
 
import cv2
import os
 
# Définition du flux capturé.
# Comme elle sera, de toutes façons, retaillée à la baisse,
# elle est fixée à la valeur la plus petite supportée par la webcam.
# À noter que cette valeur minimale peut varier en fonction de votre cam.
largeurIn = 160
hauteurIn = 120
 
# Définition du flux qui s'affichera en console.
# À savoir le nombre de caractères en largeur et en hauteur.
largeurOut = 65
hauteurOut = 20
 
# Seuil de présence des couleurs rouge, vert, bleu dans un pixel. 
# Entre 0 et 255.
seuil = 130
 
# Choix du périphérique de capture.
# Ici /dev/video0
cap = cv2.VideoCapture(0)
 
# Configuration de la définition du flux.
cap.set(3, largeurIn)
cap.set(4, hauteurIn)
 
# On efface la console.
os.system('clear')
 
# On définit une position de référence pour le curseur.
# En haut à gauche, donc, puisqu'on vient juste d'effacer la console.
print ('\033[s')
 
# Pendant... tout le temps...
while True:
 
    # On capture une image.
    ret, img = cap.read()
 
    # On retaille l'image capturée.
    img = cv2.resize(img,(largeurOut, hauteurOut))
 
    # On initialise une liste qui contiendra tous les éléments de l'image
    liste_image = []
 
    # Pour chaque ligne de l'image.
    for ligne in range(hauteurOut):
 
        # Pour chaque colonne de chaque ligne.
        for colonne in range(largeurOut):
 
            # On initialise à 0 l'indice du pixel analysé 
            indice_couleur = 0
 
            # On analyse le niveau de bleu du pixel.
            # S'il est au dessus du seuil...
            if img.item(ligne, colonne, 0) > seuil :
 
                #...on ajoute 4 à l'indice.
                indice_couleur += 4
 
            # On analyse le niveau de bleu du pixel.
            # S'il est au dessus du seuil...
            if img.item(ligne, colonne, 1) > seuil :
 
                #...on ajoute 2 à l'indice.
                indice_couleur += 2
 
            # On analyse le niveau de bleu du pixel.
            # S'il est au dessus du seuil...
            if img.item(ligne, colonne, 2) > seuil :
 
                # ...on ajoute 1 à l'indice.
                indice_couleur += 1
 
            # Si l'indice obtenu est différent de 0...
            if indice_couleur:
 
                # ...on ajoute un █ coloré à la liste.
                liste_image.append(u"\033[3{0}m█".format(indice_couleur))
 
            # Si l'indice est égale à 0...
            if not indice_couleur:
 
                # ...on ajoute un espace (noir ?) à la liste.
                liste_image.append(" ")
 
        # On fait en sorte que le terminal retrouve sa couleur initiale
        liste_image.append("\n\033[00m")
 
    # On produit un string en mettant bout à bout tous les éléments de la liste
    texte_image = ''.join(liste_image)
 
    # On affiche l'image.
    print(texte_image)
 
    # On replace le curseur à la position de référence.
    print ('\033[u')
 
    # On attend 40 millisecondes pour obtenir du 25 images par seconde.
    key = cv2.waitKey(40)

Par défaut, le script ouvre la webcam en /dev/video0 avec la ligne :

cap = cv2.VideoCapture(0)

Mais il est possible d'ouvrir /dev/video1 avec :

cap = cv2.VideoCapture(1)

De même...

cap = cv2.VideoCapture("MonFilm.avi")

... ouvrira MonFilm.avi

Exemple

Vidéo promotionnelle de l'Open Atelier Version Longue #4:

/!\ NSFW /!\ - Deep 3-bit : hommage à Vuk Cosic et son légendaire Deep ASCII.

Captation

Pour produire les vidéos ci-dessus nous avons utilisé ffmpeg de cette façon :

ffmpeg -f x11grab -r 30 -s 394x327 -i :0.0+0,0 -b 2048000 CaptureEcran.avi

Où :

  • -r 30 = à 30 images par seconde
  • 394x327 = largeur x hauteur
  • +0,0 = le coin supérieur gauche de la capture est situé en 0:0, soit en haut à gauche de l'écran.
  • -b 2048000 = bitrate