Outils pour utilisateurs

Outils du site


diy:projets:panorama

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
Prochaine révisionLes deux révisions suivantes
diy:projets:panorama [2018/05/24 11:37] gbouyjoudiy:projets:panorama [2018/05/24 12:20] gbouyjou
Ligne 9: Ligne 9:
 qu'on peut trouver généralement avec des **kit** du raspberry pi.\\ qu'on peut trouver généralement avec des **kit** du raspberry pi.\\
  
-{{ :diy:projets:supportservo.jpg?direct&200|}}+{{ :diy:projets:supportservo.jpg?direct&200|support camera pi utilisant 2 servo moteurs}} 
 En premier lieu on montrera comment [[diy:projets:panorama#Commencement avec python avec 2 images|fusionner]] 2 images sous **python**, puis je présenterais le code python nommé[[https://github.com/hiergaut/unix/blob/master/raspbian/bin/servo.py|servo.py]] permettant de bouger la camera dans toutes les directions, \\ En premier lieu on montrera comment [[diy:projets:panorama#Commencement avec python avec 2 images|fusionner]] 2 images sous **python**, puis je présenterais le code python nommé[[https://github.com/hiergaut/unix/blob/master/raspbian/bin/servo.py|servo.py]] permettant de bouger la camera dans toutes les directions, \\
 \\ \\
Ligne 15: Ligne 16:
 **servo moteurs** peuvent tirer beaucoup d'ampere et risquerais de terminer le raspberry pi.\\ **servo moteurs** peuvent tirer beaucoup d'ampere et risquerais de terminer le raspberry pi.\\
  
-Puis apres ça je présenterais un petit [[diy:projets:panorama#Prendre des photos en mode panoramique|code shell]] nommé [[https://github.com/hiergaut/unix/blob/master/raspbian/bin/fishEye.sh|fishEye.sh]] qui utiliserera la commande python faite précedement et qui prendra plusieurs photo avec une vue 360 degré voir [[diy:projets:panorama|]].\\+Puis apres ça je présenterais un petit [[diy:projets:panorama#Prendre des photos en mode panoramique|code shell]] nommé [[https://github.com/hiergaut/unix/blob/master/raspbian/bin/fishEye.sh|fishEye.sh]] qui utiliserera la commande python faite précedement et qui prendra plusieurs photo avec une vue 360 degré.\\ 
 + 
 +Puis pour finir l'utilisation d'un [[diy:projets:panorama#Utilisation de stitching.cpp|programme opencv]] pour créer le panorama avec les photos prises, 
 +on pourra spécifier le mode de rendu du panorama : 
 +  * Cylindrique 
 +  * Sphérique (par default) 
 +  * Stéréographique 
 +  * et pleins d'autres (taper en ligne de command `./stitching -h` pour voir tous les autres modes
  
 \\ \\
Ligne 24: Ligne 32:
  
 [[https://github.com/hiergaut/unix/blob/master/raspbian/bin/| lire aussi le README.md sur github]] [[https://github.com/hiergaut/unix/blob/master/raspbian/bin/| lire aussi le README.md sur github]]
 +
 +
  
  
Ligne 33: Ligne 43:
  
 \\ \\
-//Prenons ces deux photos pour entrainement//+//Prenons ces deux photos pour entrainement (splitter au préalable par mes soins)//
  
 {{:diy:projets:panorama_0.jpg?direct&400 |}} {{:diy:projets:panorama_0.jpg?direct&400 |}}
Ligne 39: Ligne 49:
  
 \\ \\
-//On peut visionner ces formes de cette façon en python//+//On peut visionner ces **formes** de cette façon en python//
 <code python> <code python>
 img =cv2.imread('panorama_0.jpg') img =cv2.imread('panorama_0.jpg')
Ligne 89: Ligne 99:
 Puis on peut utiliser le code decrit dans ce tuto pour fusionner les deux images Puis on peut utiliser le code decrit dans ce tuto pour fusionner les deux images
 [[https://www.pyimagesearch.com/2016/01/11/opencv-panorama-stitching/|]] [[https://www.pyimagesearch.com/2016/01/11/opencv-panorama-stitching/|]]
 +
 +
  
  
Ligne 96: Ligne 108:
  
 On souhaite faire un panorama 360° avec des photos prise par la camera du rpi, on aurrait pu utiliser On souhaite faire un panorama 360° avec des photos prise par la camera du rpi, on aurrait pu utiliser
-plusieurs rpi cote à cote, avec des inclinaisons differentes, mais l'option d'utiliser 2 servomoteurs+plusieurs rpi cote à cote, avec des inclinaisons differentes, mais l'option d'utiliser 2 **servomoteurs**
 permettra d'avoir une vue spherique de l'ensemble de l'environnement juste avec qu'un camera pi. permettra d'avoir une vue spherique de l'ensemble de l'environnement juste avec qu'un camera pi.
  
Ligne 109: Ligne 121:
 {{ :diy:projets:servoelec.png?direct&600 |}} {{ :diy:projets:servoelec.png?direct&600 |}}
 {{ :diy:projets:servoschema.png?direct&600 |}} {{ :diy:projets:servoschema.png?direct&600 |}}
 +
 +
 +==== Expliquation du PWM (utilisation des servos) ====
 +[[https://mespotesgeek.fr/fr/variation-de-puissance-electrique-via-raspberry/|Cliquer pour voir une expliquation détaillé]]
 +
 +Le [[https://fr.wikipedia.org/wiki/Modulation_de_largeur_d%27impulsion|PWM]] (Pulse Width Modulation) permet 
 +d'émettre un signal carré à une certaine fréquence, 2 états 0 ou 1, la proportion de l'état haut par rapport à l'état bas s'appelle le **rapport cyclique**.\\
 +
 +Par exemple si je veux un signal carré parfait (sinus carré) peut importe la fréquence fixé,
 +je fixe le rapport cyclique à 50%, et donc la durée de l'état haut sera égale à celle de l'état bas.
 +
 +\\
 +//En python on demande a un **gpio** du raspberry de fonctionner en **PWM** de cette façon ://
 +<code python>
 +pwm =GPIO.PWM(pinDuGpio, fréquence)
 +</code>
 +
 +\\
 +//Puis on fixe le **rapport cyclique** ://
 +<code python>
 +pwm.start(20)
 +</code>
 +
 +Le problème et que on ne connait pas à l'avance les rapport cycliques pour permettre aux 2 servo moteurs
 +de s'axer idéalement sur 180 degrés.
 +
 +\\
 +//Donc je propose un code python permettant de régler cela//
 +<code shell>
 +python servo.py -i
 +</code>
 +<code python>
 +def findMechanicalStop():
 +    middle=10
 +
 +    hPwm =GPIO.PWM(hPin, f)
 +    vPwm =GPIO.PWM(vPin, f)
 +#    stop=False
 +#    while (not stop):
 +#        pos -=1
 +#        hPwm.start(pos)
 +#
 +#        #ret =ord(raw_input("space to continue, enter to confirm abut: "))
 +#        ret =ord(sys.stdin.read(1))
 +#        print(ret)
 +
 +    #non-blocking get input
 +    stdscr = curses.initscr()
 +    curses.noecho()
 +    stdscr.nodelay(1) # set getch() non-blocking
 +
 +    stdscr.addstr(0,0,"Press \"ENTER to confirm abut, space to jump")
 +    line = 1
 +
 +    toes =["vMin", "vMax", "hMin", "hMax"]
 +    pwms =[vPwm, vPwm, hPwm, hPwm]
 +    values =[0, 0, 0, 0]
 +    sens =[-1, 1, -1, 1]
 +    for i in range(4):
 +        pos=middle
 +
 +        try:
 +            while (1):
 +                c = stdscr.getch()
 +                if c == 10: 
 +                    values[i] =round(pos, 2)
 +                    break
 +                elif c == 32:
 +                    print("space")
 +                    pos =pos +sens[i] *5
 +                else:
 +                    pos =pos +sens[i] *0.1
 +
 +                stdscr.addstr(line, 0, "actual pos "+ str(pos))
 +                pwms[i].start(pos)
 +
 +                time.sleep(0.1)
 +
 +
 +        finally:
 +            curses.endwin()
 +
 +    for i in range(4):
 +        print(toes[i], " =", str(values[i]))
 +</code>
  
  
Ligne 116: Ligne 213:
 \\ \\
 //Voici le code **python**// //Voici le code **python**//
 +<code shell>
 +python servo.py -m <vertical angle> <horizontal angle>
 +</code>
 <code python> <code python>
-import RPi.GPIO as GPIO +def angle(vAngle, hAngle): 
-import time+    vMin=4.0 
 +    vMax=25.0
  
 +    hMin=3.7
 +    hMax=50.0
  
-def angle(vAngle, hAngle): 
- hPin=21 
- vPin=16 
  
- GPIO.setwarnings(False) 
- GPIO.setmode(GPIO.BCM) 
- GPIO.setup(hPin, GPIO.OUT) 
- GPIO.setup(vPin, GPIO.OUT) 
  
- f=50 
- hPwm =GPIO.PWM(hPin, f) 
- vPwm =GPIO.PWM(vPin, f) 
  
-  +    hPwm =GPIO.PWM(hPin, f
- assert (-180 <= vAngle and vAngle <= 180+    vPwm =GPIO.PWM(vPin, f)
- assert (0 <= hAngle and hAngle <= 90)+
  
  
- if -90 <= vAngle and vAngle <=  90: +    assert (-180 <= vAngle and vAngle <= 180) 
- vPwm.start(11 -(vAngle +90) *8 /180.0+    assert (0 <= hAngle and hAngle <= 90)
- hPwm.start(hAngle *4 /90.0 +2)+
  
- elif vAngle < -90: 
- vPwm.start(7 -(vAngle +180) *4 /90.0) 
- hPwm.start(10 -hAngle *4 /90.0) 
  
- else+    if -90 <= vAngle and vAngle <=  90
- vPwm.start(11 -(vAngle -90) */90.0) +        vPwm.start(vMax -(vAngle +90) *(vMax -vMin) /180.0) 
- hPwm.start(10 -hAngle */90.0) +        hPwm.start(hAngle *hMax /180.0 +hMin) 
-  + 
-  +    elif vAngle < -90
- time.sleep(1) +        vPwm.start(vMin +(-vAngle -90) *(vMax -vMin) /180.0) 
- hPwm.stop +        hPwm.start(hMax -hAngle *(hMax -hMin) /180.0) 
- vPwm.stop+ 
 +    else: 
 +        vPwm.start(vMax -(vAngle -90) *(vMax -vMin) /180.0) 
 +        hPwm.start(hMax -hAngle *(hMax -hMin) /180.0) 
 + 
 +    time.sleep(1) 
 +    hPwm.stop() 
 +    vPwm.stop()
 </code> </code>
  
Ligne 166: Ligne 261:
  
 <code shell> <code shell>
-from servo import angle +./fishEye.sh 
-import os +</code> 
- +<code shell> 
-#cap = cv2.VideoCapture(0) +for j in 0 45 90 135 180 -135 -90 -45; do 
-#cap.set(3, 1920) + python servo.py -m $0
-#cap.set(4, 1080) +
-#cap.set(6, cv2.VideoWriter.fourcc('M', 'J', 'P', 'G')) +
- +
- +
-#angle(0, 0) +
-#_, frame =cap.read() +
-#cv2.imwrite('photo_0_0.jpg', frame) +
- +
-for i in (0, 45): +
- for j in (04590135180-135-90-45): +
- angle(j, i) +
- if -90 <= j and j <= 90: +
- os.system('raspistill -t 1 -vf -hf -o photo_' +str(j) +'_' +str(i) +'.jpg'+
- else: +
- os.system('raspistill -t 1 -o photo_' +str(j) +'_' +str(i) +'.jpg'+
  
 + if [ $j -ge -90 -a $j -le 90 ]; then
 + raspistill -t 100 -vf -hf -o photo_"$j"_0.jpg
 + else
 + raspistill -t 100 -o photo_"$j"_0.jpg
 + fi
 +done
 </code> </code>
  
Ligne 194: Ligne 279:
  
 ==== Video pour résumer ==== ==== Video pour résumer ====
 +Utilisation de la commande servo.py et fishEye.sh
 +\\
 +//Vous pouvez télécharger les sources directement sur le raspberry de cette façon//
 +<code shell>
 +wget https://github.com/hiergaut/unix/blob/master/raspbian/bin/fishEye.sh
 +wget https://github.com/hiergaut/unix/blob/master/raspbian/bin/servo.py
 +</code>
  
 {{youtube>S3QNFzmFdqs?medium}} {{youtube>S3QNFzmFdqs?medium}}
  
----- 
  
 +
 +
 +----
 ===== Utilisation de stitching.cpp  ===== ===== Utilisation de stitching.cpp  =====
  
-Le programme **python** etant **lent** je décide dans la suite de ce tuto d'utiliser du **code cpp**,+Le programme **python** permettant de merger plusieurs photo etant **lent** je décide dans la suite de ce tuto d'utiliser du **code cpp**,
 un [[https://github.com/opencv/opencv/blob/master/samples/cpp/stitching.cpp|programme]] deja ecrit qui permettra de créer des panorama cylindrique et stéréographique. un [[https://github.com/opencv/opencv/blob/master/samples/cpp/stitching.cpp|programme]] deja ecrit qui permettra de créer des panorama cylindrique et stéréographique.
  
Ligne 215: Ligne 309:
 </code> </code>
  
-prise de vue salle de cours, team be traitement d'image sous rpi: 
  
-mode cylindrique:+ 
 +  * mode **cylindrique**:
 <code shell> <code shell>
 ./stitching --features orb --warp cylindric *.jpg ./stitching --features orb --warp cylindric *.jpg
 </code> </code>
  
 +\\
 +//prise de vue salle de cours, team be traitement d'image sous rpi://
 {{ :diy:projets:result.jpg?direct&600 |}} {{ :diy:projets:result.jpg?direct&600 |}}
  
  
  
-mode stereographique:+  * mode **stereographique**:
 <code shell> <code shell>
 ./stitching --features orb --warp stereographic *.jpg ./stitching --features orb --warp stereographic *.jpg
 </code> </code>
 +
 +
 +===== Timelapse en mode stéréographique =====
 +
 +
  
  
  
diy/projets/panorama.txt · Dernière modification : 2018/05/24 13:07 de gbouyjou