Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » 3ForAll OnLine ! Le lecteur vidéo (problème de vitesse à résoudre)
Farhi Hors ligne Membre Points: 694 Défis: 0 Message

3ForAll OnLine ! Le lecteur vidéo (problème de vitesse à résoudre)

Posté le 28/01/2020 23:31

Bonjour à tous ! Me revoilà avec un nouveau programme, c'est un lecteur vidéo pour la calculatrice mais mon programme ne va pas assez vite, je viens demander de l'aide pour l'optimiser.
J'ai créé un programme en python qui permet d'établir une communication entre l'arduino et un afin que ceux qui n'ont pas de module Bluetooth puissent quand même tester la connexion et m'aider à résoudre ce problème.
j'ai déjà précréé une vidéo qui est stockée sur un github, l'URL de la vidéo est déjà dans le programme lui-même "3ForVLC2" il suffit de recréer un circuit électronique que j'ai détaillé à l'exception de retirer le module bluetooth et de brancher directement l'arduino à un PC et sur le programme en python de changer le port avec celui qui correspond pour vous.
l'objectif est que le programme affiche les images plus vite.
(à noter qu'avec le bluetooth la communication va moins vite, cette info est à prendre en compte)

fichiers à télécharger : Download

voir ce topic pour avoir plus de détails


Le résultat que j'aimerais obtenir serait ça (avec le noir et blanc inversé) :



code arduino

    #include <SoftwareSerial.h>

    SoftwareSerial serialCalc(10, 11); // RX, TX

    void setup()  
    {
        // Ouvre les ports serials
        Serial.begin(9600); //Pour la com avec l'ordi. Dont les ports sont Tx:1, Rx:0
        serialCalc.begin(9600); //Pour la com avec la calculatrice. Les  Donc les ports sont Tx:11, Rx:10 (ils sont définis juste au dessus)
    }

    void loop()
    {
        //si la calculatrice nous envoi quelque chose, alors on l'envoi sur l'ordi
        if(serialCalc.available())
            Serial.write(serialCalc.read());
        //si l'ordi nous envoi quelque chose, alors on l'envoi sur la calculatrice
        if(Serial.available())
            serialCalc.write(Serial.read());
    }



Calcloverhk Hors ligne Membre Points: 269 Défis: 4 Message

Citer : Posté le 29/01/2020 06:09 | #


This is amazing. Sad that the monochrome models don't support contrast of the pixels.
2045, the bright or dark future to the humanity?
https://youtu.be/WY4XLDBDyuk
Massena Hors ligne Rédacteur Points: 1926 Défis: 11 Message

Citer : Posté le 29/01/2020 06:50 | #


C'est projet marche-t-il aussi avec la Graph 90+e ? Parce que sinon, un lecteur vidéo sur cette calculatrice là serait vraiment plus pertinent que sur monochrome. Magnifique travail ! J'ai hâte de voir ce que la vidéo rend sur calculatrice pour de vrai
Lephenixnoir En ligne Administrateur Points: 21005 Défis: 143 Message

Citer : Posté le 29/01/2020 07:35 | #


Sympa. Tu peux écrire à l'écran à 400 FPS sur monochrome donc le problème c'est vraiment le transfert vers la VRAM. Si tu étais dans un add-in je te proposerais d'utiliser l'ILRAM et/ou le cache pour aller plus vite. Je pense que tu peux faire 20 FPS sans problème.

Ah oui, comme les vidéos sont souvent en 60 FPS sur Internet, tu peux afficher une image sur 2 voire sur 3 voire sur 4 si ça lagge.

Au passage, je te conseille de lier/faire un index pour tes topics sinon on risque de s'y perdre !
Farhi Hors ligne Membre Points: 694 Défis: 0 Message

Citer : Posté le 29/01/2020 07:55 | #


Merci mais la vidéo que j'ai mis sur ce topic c'est le résultat de ce que je veux obtenir mais j'ai un problème de vitesse de transfert et je demande de l'aide pour le résoudre
"La créativité est contagieuse faites la tourner"
Albert Einstein
Kikoodx Hors ligne Labélisateur Points: 2768 Défis: 11 Message

Citer : Posté le 29/01/2020 08:46 | #


Ça tombe bien j'ai une Arduino qui pourri chez moi depuis quelques années, si j'en ai l'envie/courage je testerai des trucs
As-tu tenté d'augmenter le baudrate ?
Pourrais-tu uploader tes fichiers sur une plateforme plus pratique que GDrive ([url=gitea.planet-casio.com]le Gitea de PC[/url] par exemple).
Je pense qu'il serait intéressant pour nous tous que tu expliques comment fonctionne ton projet, que nous puissions développer sur ce terrain. Il y a moyen de faire des trucs débiles avec ça en C (Steam Play sur calto ).
Time is running out
Farhi Hors ligne Membre Points: 694 Défis: 0 Message

Citer : Posté le 29/01/2020 10:13 | #


Non, j'ai pas pensé à changer le baudrate.
Je fournirai dans l'après midi une documentation détaillée ainsi que tout les fichiers qu'il faut avoir
"La créativité est contagieuse faites la tourner"
Albert Einstein
Lephenixnoir En ligne Administrateur Points: 21005 Défis: 143 Message

Citer : Posté le 29/01/2020 11:21 | #


Farhi a écrit :
Merci mais la vidéo que j'ai mis sur ce topic c'est le résultat de ce que je veux obtenir mais j'ai un problème de vitesse de transfert et je demande de l'aide pour le résoudre

J'ai bien vu mais je risque pas de savoir, j'ai pas le matériel pour tester et tu n'as donné aucune indication... on n'est pas devins
Farhi Hors ligne Membre Points: 694 Défis: 0 Message

Citer : Posté le 29/01/2020 14:11 | #


Comment on fait pour faire un index pour relier toutes les topics ?
"La créativité est contagieuse faites la tourner"
Albert Einstein
Lephenixnoir En ligne Administrateur Points: 21005 Défis: 143 Message

Citer : Posté le 29/01/2020 14:36 | #


Tu mets en haut de chaque topic un lien vers les deux autres.

Ajouté le 01/02/2020 à 10:23 :
Salut, tu dis que tu as un problème ici mais tu n'as jamais dit lequel, donc on risque pas de pouvoir t'aider.

Il y a 8192 bits à transférer pour une image en plein écran. Ton baudrate est de 9600 bits par seconde. Compte-tenu des parités/checksum, tu as probablement 10 bits sur le port série pour 8 bits de données. Ça fait 10240 bits à transférer en tout, soit 1.07 seconde par image à vue de nez.

Donc déjà c'est sûr que ça va pas aller vite.

Spécifie proprement ton problème !
• Qu'est-ce que tu as essayé et où est-ce qu'on peut voir le code complet ?
• Qu'est-ce que ça produit et à quoi est-ce que tu attendais ?
• As-tu essayé d'autres alternatives (eg. baud rate plus élevé) et quels ont été les effets ?
• Comment peut-on tester le problème nous-même ?
Farhi Hors ligne Membre Points: 694 Défis: 0 Message

Citer : Posté le 01/02/2020 13:16 | #


Ce que j'ai voulu faire:
Le programme se trouvant sur l'ordi (en python) ou le téléphone télécharge depuis mon github la vidéo modifiée, l'ordi ou le téléphone décompose les images séparées par des "@", la calculatrice demande le n° de l'image avec "StrJoin("&vlc:&PIC:", Str 1) -> Str 2" puis reçoit l'image stockée en String et l'affiche avec la position qui est calculée par "Exp(StrMid(Str r, I, 2))" et fait ça en boucle.
Le programme "IntStr" transforme juste une variable stockée dans A en string dans Str1.
Le programme "~STR.L" est juste une saisi de texte.
Vous pouvez trouver les fichiers ici.

Une partie du code :
Code de 3ForVLC2.g1m
Cliquer pour enrouler

ClrGraph
ViewWindow 1, 127, 0, 1, 63, 0
"https://raw.githubusercontent.com/leofarhi/3ForAll/master/video1.txt" -> Str 1
Prog "~STR.L"
StrRepl(Str 1, "-", "&ascii_^;1") -> Str 1
StrJoin("&vlc:&URL:", Str 1) -> Str 1
Send(Str 1, 5)
Prog "RECIVE"

1 -> Q
While 1
    Q -> A
    Prog "IntStr"
    StrJoin("&vlc:&PIC:", Str 1) -> Str 2
    Send(Str 2, 5)
    Prog "RECIVE"
    1 -> I
    _ClrVram
    Text 1, 1, Q
    While StrLen(Str ) > I + 8
        
        Try Exp(StrMid(Str r, I, 2)) -> N
        Exp(StrMid(Str r, I + 2, 3)) -> S
        Exp(StrMid(Str r, I + 5, 3)) -> T
        _Line S, N, T, N
        Except 1
        TryEnd
        _DispVram
        I + 8 -> I
    WhileEnd
    _DispVram
    Q + 1 -> Q
WhileEnd


Code de RECIVE.g1m
Cliquer pour enrouler
{1, 6} -> Dim Mat r
'#Str r
OpenComport38k, 5, 0
Receive38k Str r
CloseComport38k
{1, Exp(Str r)} -> Dim Mat r
'#Str r
Send("&S:", 5)
OpenComport38k, 5, 0
Receive38k Str r
CloseComport38k
Return


Ce qui s'est produit :

La communication des données entre ordis ou téléphone est trop lente, j'ai essayé de modifier baudrate mais les envoyés et/ou reçu était corrompu (après je ne sais pas si j'ai correctement fait les modifications pour le baudrate).
La conversion d'un String en Int avec "Exp(StrMid(Str r, I, 2))" est trop lente.

J'ai fait deux autres alternatifs et la version que je vous ai transmise est la version 2 dont son nom 3ForVLC2.
L'une consistait à télécharger toutes les images et les Stocker dans des listes, un véritable échec au point de vue temps et la calto crashé à cause de la mémoire insuffisante.
L'autre téléchargeait 3 images à la fois et les affichait, aussi un échec.
Le meilleur est donc celui ci mais pas assez performant.

Pour la question de "Comment peut-on tester le problème nous-même ?" je suis actuellement en train d'y réfléchir (un éventuel émulateur ?)
"La créativité est contagieuse faites la tourner"
Albert Einstein
Lephenixnoir En ligne Administrateur Points: 21005 Défis: 143 Message

Citer : Posté le 01/02/2020 13:42 | #


Wooow mais d'accord la façon dont tu affiches l'image est pas bonne du tout, c'est ça le problème.

Dans C.Basic tu peux manipuler des bitmaps avec des matrices. Il faut définitivement que tu fasses comme ça. Ta matrice fait 128x64 en stockage 1-bit et représente donc une image en plein écran. Tu reçois la matrice et tu l'affichages avec la commande Bmp qui va bien. Il ne faut surtout pas que tu décomposes l'image avec des calculs parce que ce sera bien trop lent.
Farhi Hors ligne Membre Points: 694 Défis: 0 Message

Citer : Posté le 01/02/2020 14:13 | #


Code en python (transfère)
Cliquer pour enrouler
from bs4 import BeautifulSoup
import urllib3
import requests
import socket
import serial
import time
import sys
import os
O=False
for i in range(400):
    if O:
        break
    try:
        arduino=serial.Serial("/COM"+str(i),timeout=1,baudrate=9600)#port de l'arduino à régler en fonction de celui que vous utilisez
        O=True
    except:
        ""
print("connecté: /COM",i)
try:
    # Python2
    from urllib2 import urlopen
except ImportError:
    # Python3
    from urllib.request import urlopen
def web(url):
    http = urllib3.PoolManager()
    #print(url)

    try:
            response = requests.get(url)
            map_html = BeautifulSoup(response.content, "html.parser")
            map_html=str(map_html)
            map_html=map_html.replace("</string>","")
            map_html=map_html.replace("é","é")
    except:
            map_html = (urlopen(url).read()).decode()
    return str(map_html)
def sep(texte):
    lst2=["\n","\r","\t"]
    #texte=texte.split("<body")[1]
    a=texte.split(">")
    del a[0]
    b=[]
    for i in a:
        d=i.split("<")[0]
        if d!="":
            if not d in lst2:
                b.append(d)
        
    return b
def uni(lst):
    a=""
    for i in lst:
        a=a+i
    return a
def read():
    b=str(arduino.readline().decode('latin-1'))
    b=b.replace("\x00","")
    b=b.replace("^1","-")
    b=b.replace("https:/w","https://w")
    b=b.replace("¹","/")
    return b
def write(txt):
    arduino.write(str("000000"[:6-len(str(len(str(txt))))]+str(len(str(txt)))).encode())
    b=0
    while True:
        a=read()
        if a!="":
            break
        if b>3:
            break
        b=b+1
    time.sleep(0.5)
    arduino.write(str(txt).encode())

while True:
    a=read()
    if a!="" and "&" in a:
        a=a.split("&")
        del a[0]
        c=""
        for i in a:
            c=c+"&"+i
        a=c
        if "&vlc:" in a:
            print(a)
            a=a.replace("&vlc:","")
            if "&URL:"in a:
                a=a.replace("&URL:","")
                b=web(a)
                b=b.split("@")
                time.sleep(1)
                write("ok")
                print("ok")
            if "&PIC:"in a:
                a=a.replace("&PIC:","")
                a=int(a)
                print(len(b[a]))
                write(b[a])
            a=""




Code en python (décodage vidéo)
Cliquer pour enrouler

#il y a des parties du code inutile (se sont des restes des anciennes versions)
import cv2
import os
from PIL import Image
import pylab as pl
import matplotlib.cm as cm
import numpy as np
#import ImageEnhance
#import ImageFilter
  
# Read the video from specified path
cam = cv2.VideoCapture("vidéo.mp4")
  
try:
      
    # creating a folder named data
    if not os.path.exists('data'):
        os.makedirs('data')
    os.makedirs('dataf')
  
# if not created then raise error
except OSError:
    print ('Error: Creating directory of data')
  
# frame
currentframe = 0
def contour(newImg):
    #newImg = cv2.split(newImg)[0]
    newImg = cv2.Laplacian(newImg, cv2.CV_8U, ksize = 5)
    newImg = cv2.split(newImg)[0]
    #newImg = cv2.Canny(newImg, 300, 400)
    return newImg
def gray(im):
    im =Image.fromarray(im)
    im_grey = im.convert('L') # convert the image to *greyscale*
    im= im.convert('1')
    im_array = np.array(im_grey)
    #pl.imshow(im_array, cmap=cm.Greys_r)
    return im_array
def bitam(bitmap):
    # Split the three channels
    
    bitmap = np.dot((bitmap > 128).astype(float),255)
    im = Image.fromarray(bitmap.astype(np.uint8))
    return im
def arraylst(img):
    a=np.array(frame)
    c=a.tolist()
    for ind,i in enumerate(c):
        for ind2,o in enumerate(i):
            if o==255:
                (c[ind])[ind2]=1
    return c
def save_file(lst,name):
    with open(name+'.txt','a') as fic:
        fic.write(str(lst))


def create_line(lst):
    a=""
    t=False
    z=[]
    for ind,i in enumerate(lst):
        for ind2,o in enumerate(i):
            if o==1:
                if t==False:
                    z=[]
                    t=True
                    z.append("0"[:2-len(str(ind))]+str(ind))
                    z.append("00"[:3-len(str(ind2))]+str(ind2))
            else:
                if t:
                    t=False
                    z.append("00"[:3-len(str(ind2))]+str(ind2))
                    a=a+z[0]+z[1]+z[2]
                    z=[]
        if t:
            t=False
            z.append("00"[:3-len(str(ind2))]+str(ind2))
            a=a+z[0]+z[1]+z[2]
            z=[]
    a=a+"@"
    return a
with open('img.txt','w') as fic:
    ""
f=0
g=0
def vérif_file(name):
    try:
        with open(name+'.txt','r') as fic:
            a=fic.read()
    except:
        a=""
    return len(a)
while(True):
      
    # reading from frame
    ret,frame = cam.read()
  
    if ret:
        # if video is still left continue creating images
        name = './data/frame' + str(currentframe) + '.bmp'
        namef = './dataf/pic' + str(g)
        print ('Creating...' + name)
        width = 127#int(frame.shape[1] * scale_percent / 100)
        height = 63#int(frame.shape[0] * scale_percent / 100)
        dim = (width, height)
        # resize image
        frame = cv2.resize(frame, dim, interpolation = cv2.INTER_AREA)
        frame=contour(frame)
        frame=gray(frame)
        frame=bitam(frame)
        frame=np.array(frame)
        # writing the extracted images
        
        #cv2.imwrite(name, frame)
        w=create_line(arraylst(frame))
        if vérif_file(namef)+len(w)>9000:
            g+=1
        save_file(w,"img")
        f+=1
        # increasing counter so that it will
        # show how many frames are created
        currentframe += 3
    else:
        break
  
# Release all space and windows once done
cam.release()
cv2.destroyAllWindows()


Mais du coup je ne visualise pas bien comme je dois m'y prendre, suis pas très à l'aise avec les matrices...

Ajouté le 01/02/2020 à 14:35 :
j'ai pas très bien compris en faite le système avec les bitmaps, je sais même pas ce que c'est. Mais si je comprend bien avec une certaine commande on peux afficher une image avec une matrice... le seul souci c'est que l'ordi ou le téléphone transfère que du String.
"La créativité est contagieuse faites la tourner"
Albert Einstein
Math680 Hors ligne Membre Points: 455 Défis: 5 Message

Citer : Posté le 01/02/2020 14:50 | #


Ca marcherait avec un rasberry pi au lieu d'un arduino ?
“Il y a bien moins de difficultés à résoudre un problème qu’à le poser.”

Vous êtes fan de « The legend of Zelda ocarina of Time »,si c’est le cas allez voir ZeldaGAME
mon projet de jeu basic casio
Lephenixnoir En ligne Administrateur Points: 21005 Défis: 143 Message

Citer : Posté le 01/02/2020 14:57 | #


Il faut que tu perfectionnes ton C.Basic parce qu'il y vraiment à gagner là. Le Basic normal ne marchera jamais, c'est peine perdue.

j'ai pas très bien compris en faite le système avec les bitmaps, je sais même pas ce que c'est. Mais si je comprend bien avec une certaine commande on peux afficher une image avec une matrice... le seul souci c'est que l'ordi ou le téléphone transfère que du String.

Oui, c'est ça, tu peux stocker une image dans une matrice et l'afficher d'un coup. Bitmap c'est juste un type d'image.

Ton ordi ou ton téléphone transfère ce que tu veux, une matrice ce n'est qu'un gros paquet d'octets comme les autres.
Farhi Hors ligne Membre Points: 694 Défis: 0 Message

Citer : Posté le 01/02/2020 15:37 | #


Math680 a écrit :
Ca marcherait avec un rasberry pi au lieu d'un arduino ?

je pense que oui il suffit de connecter le GND de la prise mini jack à celui de ton raspberry et le RX de calto au TX du raspberry et le TX de la calto au RX du raspberry (n'oublie pas de placer la diode au bon endroit pour éviter de cramé ton matériel). Il te faudra aussi le code en python que tu devras exécuter.

Code RECIVE.g1m
Cliquer pour enrouler
{1, 6} -> Dim Mat r
'#Str r
OpenComport38k, 5, 0
Receive38k Str r
CloseComport38k
{1, Exp(Str r)} -> Dim Mat r
'#Str r
Send("&S:", 5)
OpenComport38k, 5, 0
Receive38k Str r
CloseComport38k
Return


Pour ce qui en ai du transfère de données en matrice, j'aura besoin d'aide.
J'aurai juste besoin qu'on me donne le code qui "remplacerai" le le RECIVE.g1m qui au lieux de recevoir en String que je reçois en matrice, ainsi qu'un exemple de la donnée que dois rentré dans la fonction write (dans le code python)
Et après normalement, le lecteur vidéo sera fonctionnel !

Ajouté le 01/02/2020 à 15:40 :
Et bien sûr je compte m'améliorer en C. Basic c'est juste que je viens de découvrir son existence depuis peu de temps alors qu'il date de longtemps.

Ajouté le 24/08/2020 à 16:10 :
Je me disais s'il y aurais pas un moyen d'envoyer un bitmap direct via le port 3-pin et le recevoir avec C.Basic ?
"La créativité est contagieuse faites la tourner"
Albert Einstein
Kbd2 Hors ligne Membre Points: 269 Défis: 0 Message

Citer : Posté le 24/08/2020 16:13 | #


It wouldn't be different from any other data transfer, and you'd have a magic signature to confirm that it is a bitmap, so it's definitely possible.

Validating the header/image data is a different story though, and the (possibly large) bitmap would need to be stored somewhere.

EDIT: I really wouldn't recommend a bitmap over directly transferring data with a small header for the size, especially if it's being parsed with C.Basic. Unless C.Basic can do bitwise operations, you need to use 8BPP or above for the data, and the format requires things like 4-byte row alignments and colour tables and it all turns into a big hassle.
Farhi Hors ligne Membre Points: 694 Défis: 0 Message

Citer : Posté le 24/08/2020 16:16 | #


Ok I'll explore this to see if the image transfer will go faster.
Thank you

Ajouté le 24/08/2020 à 17:28 :
J'ai une erreur avec le baudrate je n'arrive pas à lire les String au delà de 9600 avec un arduino.
j'ai essayé avec un baudrate de 115200
Par exemple je rentre le code suivant sur la calculatrice :

{1,6}->Dim Mat 4
'#Str 4
"TEST12"->Str 4
OpenComport38k, 9, 0
Receive38k Str 4
CloseComport38k

Et les données que je reçois depuis l'arduino sont :
[⸮

Alors que l'inverse fonctionne c'est à dire qu'avec le même baudrate, je parviens à envoyer des messages depuis l'arduino à la Casio
Est-ce que quelqu'un serai capable de m'expliquer le problème ?
Merci d'avance pour votre réponse
"La créativité est contagieuse faites la tourner"
Albert Einstein
Lephenixnoir En ligne Administrateur Points: 21005 Défis: 143 Message

Citer : Posté le 25/08/2020 10:47 | #


Est-ce que par hasard OpenComport38k ne serait pas limité à 38k bauds ?
Farhi Hors ligne Membre Points: 694 Défis: 0 Message

Citer : Posté le 25/08/2020 11:53 | #


C'est vrai que dit comme ça paraît logique mais c'était pas indiqué sur la documentation. Merci je vais du coup essayer de baisser le bauds et voir si ça fonctionne
"La créativité est contagieuse faites la tourner"
Albert Einstein

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 78 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd