diy:projets:panorama
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
diy:projets:panorama [2018/05/23 14:44] – gbouyjou | diy:projets:panorama [2018/05/24 13:07] (Version actuelle) – gbouyjou | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | Le principe même du panorama entre deux photo est de reperer les similitudes entres elles comme des coins | + | ====== Panorama ====== |
- | ou autres formes facilement reperables. | + | ===== Introduction ===== |
- | Prenons ces deux photos pour entrainement | + | Le but de ce tutoriel sera d' |
- | {{: | + | On aurrait pu pour cela tourner la camera du raspberry pi **à la main**, ou utiliser **plusieurs** raspberry pi avec |
- | {{ : | + | leurs camera pour pouvoir avoir une vue panoramique, |
- | on peut visionner ces formes | + | La seule solution possible étant d' |
+ | qu'on peut trouver généralement avec des **kit** du raspberry pi.\\ | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | En premier lieu on montrera comment [[diy: | ||
+ | \\ | ||
+ | Ensuite j' | ||
+ | **servo moteurs** peuvent tirer beaucoup d' | ||
+ | |||
+ | Initialisation des rapports cycliques (servo utilisant les gpio PWM) graces a un [[diy: | ||
+ | |||
+ | Puis apres ça je présenterais un petit [[diy: | ||
+ | |||
+ | Puis pour finir l' | ||
+ | on pourra spécifier le mode de rendu du panorama : | ||
+ | * **Cylindrique** | ||
+ | * **Sphérique** (__par default__) | ||
+ | * **Stéréographique** | ||
+ | * et pleins d' | ||
+ | \\ | ||
+ | //Tapez dans un terminal la commande pour voir les autres options// | ||
+ | <code shell> | ||
+ | ./stitching -h | ||
+ | </ | ||
+ | |||
+ | \\ | ||
+ | //Vous pouvez télécharger le code source directement avec wget en console, exemple avec le fichier [[https:// | ||
+ | <code shell> | ||
+ | wget https:// | ||
+ | </ | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | ===== Commencement avec python avec 2 images ===== | ||
+ | |||
+ | Le principe même du **panorama** entre deux photo est de reperer les **similitudes** entres elles comme des **coins** | ||
+ | ou autres formes facilement reperables.\\ | ||
+ | |||
+ | \\ | ||
+ | //Prenons ces deux photos pour entrainement (splitter au préalable par mes soins)// | ||
+ | |||
+ | {{: | ||
+ | {{ : | ||
+ | \\ | ||
+ | //On peut visionner ces **formes** de cette façon en python// | ||
<code python> | <code python> | ||
img =cv2.imread(' | img =cv2.imread(' | ||
Ligne 24: | Ligne 73: | ||
</ | </ | ||
- | {{ : | + | {{ : |
- | + | ||
- | avant de faire la fusion il faut trouver les points qui se trouve sur les 2 images, on peut visionner cela avec ce code | + | |
+ | \\ | ||
+ | //Avant de faire la **fusion** il faut trouver les **points** qui se trouve sur les 2 images, on peut visionner cela avec ce code// | ||
<code python> | <code python> | ||
img1c =cv2.imread(' | img1c =cv2.imread(' | ||
Ligne 51: | Ligne 100: | ||
</ | </ | ||
- | on visionne les points repere entres les 2 images, on peut voir qu'il y en a beaucoup | + | \\ |
+ | //On visionne les **points** repere entres les 2 images, on peut voir qu'il y en a beaucoup// | ||
{{ : | {{ : | ||
- | puis on peut utiliser le code decrit dans ce tuto | + | \\ |
+ | Puis on peut utiliser le code decrit dans ce tuto pour fusionner les deux images | ||
[[https:// | [[https:// | ||
- | pour fusionner les deux parties. | ||
- | Le programme python etant lent je décide dans la suite de ce tuto d' | ||
- | un programme deja ecrit qui permettra de créer des panorama cylindrique et stéréographique. | ||
- | <code shell> | + | \\ |
- | ./stitching --features orb --warp stereographic picture*.jpg | + | \\ |
- | ./ | + | ---- |
- | </ | + | ===== Utilisation des servo moteurs avec python (lib GPIO) ===== |
- | 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, | + | 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, | ||
permettra d' | permettra d' | ||
- | {{ : | + | ==== Montage électrique ==== |
+ | \\ | ||
+ | // | ||
- | avant de lancer le panorama, il faut preparer un programme python pour diriger la camera selon n' | + | {{ : |
- | je décide | + | |
- | voici le code python | + | \\ |
+ | // | ||
+ | |||
+ | {{ : | ||
+ | {{ : | ||
+ | |||
+ | \\ | ||
+ | ==== Expliquation du PWM (utilisation des servos) ==== | ||
+ | [[https:// | ||
+ | |||
+ | Le [[https://fr.wikipedia.org/ | ||
+ | d'émettre un signal carré à une certaine fréquence, 2 états | ||
+ | |||
+ | 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' | ||
+ | |||
+ | \\ | ||
+ | //En python | ||
<code python> | <code python> | ||
- | import RPi.GPIO as GPIO | + | pwm =GPIO.PWM(pinDuGpio, |
- | import time | + | </ |
+ | \\ | ||
+ | //Puis on fixe le **rapport cyclique** :// | ||
+ | <code python> | ||
+ | pwm.start(20) | ||
+ | </ | ||
- | def angle(vAngle, | ||
- | hPin=21 | ||
- | vPin=16 | ||
- | GPIO.setwarnings(False) | + | Le problème et que on ne connait pas à l' |
- | GPIO.setmode(GPIO.BCM) | + | de s'axer idéalement sur 180 degrés. |
- | GPIO.setup(hPin, | + | |
- | GPIO.setup(vPin, | + | |
- | f=50 | + | \\ |
- | hPwm =GPIO.PWM(hPin, f) | + | //Donc je propose un code python permettant de régler cela// |
- | vPwm =GPIO.PWM(vPin, | + | <code shell> |
+ | python servo.py -i | ||
+ | </ | ||
+ | <code python> | ||
+ | def findMechanicalStop(): | ||
+ | | ||
- | + | hPwm =GPIO.PWM(hPin, | |
- | assert | + | vPwm =GPIO.PWM(vPin, f) |
- | assert | + | # stop=False |
+ | # while (not stop): | ||
+ | # pos -=1 | ||
+ | # hPwm.start(pos) | ||
+ | # | ||
+ | # #ret =ord(raw_input(" | ||
+ | # ret =ord(sys.stdin.read(1)) | ||
+ | # print(ret) | ||
+ | # | ||
+ | stdscr = curses.initscr() | ||
+ | curses.noecho() | ||
+ | stdscr.nodelay(1) # set getch() non-blocking | ||
- | if -90 <= vAngle and vAngle <= 90: | + | stdscr.addstr(0, |
- | vPwm.start(11 -(vAngle +90) *8 /180.0) | + | line = 1 |
- | hPwm.start(hAngle *4 /90.0 +2) | + | |
- | elif vAngle < -90: | + | toes =[" |
- | vPwm.start(7 -(vAngle +180) *4 /90.0) | + | pwms =[vPwm, vPwm, hPwm, hPwm] |
- | hPwm.start(10 | + | values =[0, 0, 0, 0] |
+ | sens =[-1, 1, -1, 1] | ||
+ | for i in range(4): | ||
+ | pos=middle | ||
- | else: | + | try: |
- | vPwm.start(11 -(vAngle -90) *4 /90.0) | + | while (1): |
- | hPwm.start(10 -hAngle *4 /90.0) | + | c = stdscr.getch() |
- | + | if c == 10: | |
- | + | values[i] =round(pos, 2) | |
- | time.sleep(1) | + | break |
- | hPwm.stop | + | elif c == 32: |
- | vPwm.stop | + | print(" |
+ | pos =pos +sens[i] | ||
+ | else: | ||
+ | pos =pos +sens[i] *0.1 | ||
+ | |||
+ | stdscr.addstr(line, | ||
+ | | ||
+ | |||
+ | time.sleep(0.1) | ||
+ | |||
+ | |||
+ | finally: | ||
+ | curses.endwin() | ||
+ | |||
+ | for i in range(4): | ||
+ | print(toes[i], | ||
</ | </ | ||
- | on peut prendre des photos avec une inclinaisons autours | + | \\ |
- | tout autour de l'axe vertical | + | Avant de lancer le panorama, il faut preparer un programme python pour diriger la camera selon n'importe quel inclinaison.\\ |
+ | Je décide de créer une fonction prenant 2 argument [-180..180] pour autour de l'axe vertical, | ||
+ | \\ | ||
+ | //Voici le code **python**// | ||
+ | <code shell> | ||
+ | python servo.py -m < | ||
+ | </ | ||
<code python> | <code python> | ||
- | from servo import | + | def angle(vAngle, hAngle): |
- | import os | + | |
+ | vMax=25.0 | ||
- | #cap = cv2.VideoCapture(0) | + | hMin=3.7 |
- | #cap.set(3, 1920) | + | |
- | #cap.set(4, 1080) | + | |
- | #cap.set(6, cv2.VideoWriter.fourcc(' | + | |
- | #angle(0, 0) | ||
- | #_, frame =cap.read() | ||
- | # | ||
- | for i in (0, 45): | ||
- | for j in (0, 45, 90, 135, 180, -135, -90, -45): | ||
- | angle(j, i) | ||
- | if -90 <= j and j <= 90: | ||
- | os.system(' | ||
- | else: | ||
- | os.system(' | ||
+ | hPwm =GPIO.PWM(hPin, | ||
+ | vPwm =GPIO.PWM(vPin, | ||
+ | |||
+ | assert (-180 <= vAngle and vAngle <= 180) | ||
+ | assert (0 <= hAngle and hAngle <= 90) | ||
+ | |||
+ | |||
+ | if -90 <= vAngle and vAngle <= 90: | ||
+ | vPwm.start(vMax -(vAngle +90) *(vMax -vMin) /180.0) | ||
+ | hPwm.start(hAngle *hMax /180.0 +hMin) | ||
+ | |||
+ | elif vAngle < -90: | ||
+ | vPwm.start(vMin +(-vAngle -90) *(vMax -vMin) /180.0) | ||
+ | hPwm.start(hMax -hAngle *(hMax -hMin) /180.0) | ||
+ | |||
+ | 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() | ||
</ | </ | ||
- | j'utilise raspistill au lieu d'utiliser VideoCapture | + | On peut prendre des photos avec une inclinaisons autours de l'axe horizontal de 0 et 45 degre |
+ | tout autour de l'axe vertical | ||
+ | \\ | ||
+ | |||
+ | ==== Prendre des photos en mode panoramique ==== | ||
+ | \\ | ||
+ | //Voici le **script shell** utilisant le programme python pour prendre des photos en mode panoramique.// | ||
+ | |||
+ | <code shell> | ||
+ | ./ | ||
+ | </ | ||
+ | <code shell> | ||
+ | for j in 0 45 90 135 180 -135 -90 -45; do | ||
+ | python servo.py -m $j 0 | ||
+ | |||
+ | if [ $j -ge -90 -a $j -le 90 ]; then | ||
+ | raspistill -t 100 -vf -hf -o photo_" | ||
+ | else | ||
+ | raspistill -t 100 -o photo_" | ||
+ | fi | ||
+ | done | ||
+ | </ | ||
+ | |||
+ | J' | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ==== 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:// | ||
+ | wget https:// | ||
+ | </ | ||
+ | |||
+ | \\ | ||
+ | // Video résumant le init pwm, et le fishEye.// | ||
+ | {{youtube> | ||
+ | |||
+ | |||
+ | |||
+ | \\ | ||
+ | \\ | ||
+ | ---- | ||
+ | ===== Utilisation de stitching.cpp | ||
+ | |||
+ | Le programme **python** permettant de merger plusieurs photo etant **lent** je décide dans la suite de ce tuto d' | ||
+ | un [[https:// | ||
+ | |||
+ | <code shell> | ||
+ | ./stitching --features orb --warp stereographic picture*.jpg | ||
+ | ./stitching --features orb --warp cylindric picture*.jpg | ||
+ | </ | ||
+ | \\ | ||
+ | Maintenant reste plus qu'a fusionner les images recement capturées, pour cela | ||
telechargeons le code cpp sur github | telechargeons le code cpp sur github | ||
[[https:// | [[https:// | ||
Ligne 154: | Ligne 328: | ||
</ | </ | ||
- | prise de vue salle de cours, team be traitement d' | + | \\ |
+ | ==== Divers mode (features) | ||
- | mode cylindrique: | + | * mode **cylindrique**: |
<code shell> | <code shell> | ||
- | ./stitching --features orb --warp cylindric | + | ./stitching --features orb --warp cylindric |
</ | </ | ||
+ | |||
+ | \\ | ||
+ | //prise de vue salle de cours, team be traitement d' | ||
{{ : | {{ : | ||
+ | \\ | ||
- | + | * mode **stereographique**: | |
- | mode stereographique: | + | |
<code shell> | <code shell> | ||
- | ./stitching --features orb --warp stereographic | + | ./stitching --features orb --warp stereographic |
</ | </ | ||
+ | |||
+ | |||
+ | |||
+ | \\ | ||
+ | \\ | ||
+ | ---- | ||
+ | ===== Timelapse en mode stéréographique ===== | ||
+ | |||
+ | |||
diy/projets/panorama.1527086691.txt.gz · Dernière modification : 2018/05/23 14:44 de gbouyjou