mercoledì 25 febbraio 2015
CloudPoint da fotogrammetria con AgiSoft Photoscan
Usando gli stessi dati del post precedente ho provato un software commerciale (Agisoft Photoscan) che ricrea modelli 3D da normali foto. Ogni commento mi sembra superfluo (vedi video)
CloudPoint da fotogrammetria
Mentre stavamo parlando dell'uso di Kinect per realizzare modelli 3D un amico mi ha parlato di fare la stessa cosa usando una comune macchina fotografica e la fotogrammetria. Di istinto ero un po' scettico ma ho comunque voluto dare un'occhiata a cosa trovavo su Internet
La mia attenzione e' stata catturata da VisualFSM un programma opensource che funziona su Windows, Mac e Linux (per gli ultimi si deve partire dai sorgenti mentre per Windows si puo' scaricare il compilato direttamente da qui o qui
Per semplicita' ho provato la versione Windows ATTENZIONE: per funzionare il programma ha bisogno delle librerie di CMVS che non sono comprese nel pacchetto (si devono scaricare i compilati da questo link e porre i file cmvs.exe, genOption.exe e pmvs2.exe nel path di Windows ..io non per fare prima li ho messi direttamente in c:\windows\) ed i file ed i programmi devono essere messi all'interno di directory con nomi privi di caratteri speciali...C:\Documents and Settings\ non va bene)
Detto cio' ho fatto una decina di foto a questo edificio da diverse angolazioni
Le operazioni con VisualFSM sono molto semplici
1) Prima si importano le foto da File/Open Multi Image
2) Si effettua il confronto a coppie delle immagini con SfM/Pariwise Matching/Compute Missing Matching
3) SfM/Reconstruct Sparse
4) SfM/Reconstruct Dense (viene chiesto dove salvare un file .nvm
come si osserva non si fornisce nessuna informazioni geometrica
Dopo un po' di calcoli e se le immagini sono sufficienti per la ricostruzione viene creati una serie di file che saranno poi gestiti mediante Meshlab (per riferimento si vada a questo link)3
Questa e' la ricostruzione. La nuvola dei punti non e' molto densa ma per essere il primo tentativo non e' male (si veda per confronto la prima foto)
Un aspetto interessante e' che questo approccio puo' essere utilizzato anche con immagini riprese da droni
La mia attenzione e' stata catturata da VisualFSM un programma opensource che funziona su Windows, Mac e Linux (per gli ultimi si deve partire dai sorgenti mentre per Windows si puo' scaricare il compilato direttamente da qui o qui
Per semplicita' ho provato la versione Windows ATTENZIONE: per funzionare il programma ha bisogno delle librerie di CMVS che non sono comprese nel pacchetto (si devono scaricare i compilati da questo link e porre i file cmvs.exe, genOption.exe e pmvs2.exe nel path di Windows ..io non per fare prima li ho messi direttamente in c:\windows\) ed i file ed i programmi devono essere messi all'interno di directory con nomi privi di caratteri speciali...C:\Documents and Settings\ non va bene)
Detto cio' ho fatto una decina di foto a questo edificio da diverse angolazioni
Le operazioni con VisualFSM sono molto semplici
1) Prima si importano le foto da File/Open Multi Image
2) Si effettua il confronto a coppie delle immagini con SfM/Pariwise Matching/Compute Missing Matching
3) SfM/Reconstruct Sparse
4) SfM/Reconstruct Dense (viene chiesto dove salvare un file .nvm
come si osserva non si fornisce nessuna informazioni geometrica
Dopo un po' di calcoli e se le immagini sono sufficienti per la ricostruzione viene creati una serie di file che saranno poi gestiti mediante Meshlab (per riferimento si vada a questo link)3
Questa e' la ricostruzione. La nuvola dei punti non e' molto densa ma per essere il primo tentativo non e' male (si veda per confronto la prima foto)
Ruotando l'immagine si osserva che l'angolo dell'edificio e' stato ricostruito in modo corretto con un angolo molto prossimo ai 90°
Un aspetto interessante e' che questo approccio puo' essere utilizzato anche con immagini riprese da droni
martedì 24 febbraio 2015
LVM su Linux
In questo post viene indicata la procedura per creare un volume LVM (ovvero un metodo per gestire in modo piu' flessibile le partizioni e per poter aggiungere spazio a volumi senza essere limitati dalla dimensione fisica dei dischi rigidi)
Per questa prova, per semplicita', e' stata usata Ubuntu virtualizzata su Virtualbox aggiungendo due dischi fissi (oltre a quello dove e' installato il sistema) da configurare come LVM
Per prima cosa devono essere installati i seguenti pacchetti per la gestione di LVM
apt-get install lvm2 dmsetup mdadm reiserfsprogs xfsprogs
---------------------------------------------------------------------
root@luca-VirtualBox:/home/luca# fdisk -l
Disk /dev/sda: 22.0 GB, 22011707392 bytes
255 heads, 63 sectors/track, 2676 cylinders, total 42991616 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0007fa80
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 34603007 17300480 83 Linux
/dev/sda2 34605054 42989567 4192257 5 Extended
/dev/sda5 34605056 42989567 4192256 82 Linux swap / Solaris
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders, total 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/sdc: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders, total 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/sdc doesn't contain a valid partition table
---------------------------------------------------------------------
Il primo passo e' creare una partizione in in /dev/sdb con
fdisk /dev/sdb
creando una partizione primaria (tasti n/p/1) e cambiando il formato in Linux LVM (tasti t e parametro 8e). Per confermare ed uscire tasto w
Verra' creato un device in /dev/sdb1 e si puo' procedere a configurare LVM. Lo schema e' il seguente
Ripreso da https://www.howtoforge.com/linux_lvm |
Nel caso in esame verra' creato un solo gruppo fileserver ed un solo volume logico backup
Si procede a creare il volume fisico ed il gruppo "fileserver"
root@luca-VirtualBox:/home/luca# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
root@luca-VirtualBox:/home/luca# vgcreate fileserver /dev/sdb1
Volume group "fileserver" successfully created
si crea quindi il volume logico backup dentro filesever e si impone una dimensione di 1 Giga
root@luca-VirtualBox:/home/luca# lvcreate -L 1G -n backup fileserver
Logical volume "backup" created
si deve poi formattare il nuovo dispositivo
root@luca-VirtualBox:/home/luca# mkfs.ext4 /dev/fileserver/backup
mke2fs 1.42.9 (4-Feb-2014)
Etichetta del filesystem=
OS type: Linux
Dimensione blocco=4096 (log=2)
Dimensione frammento=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
Primo blocco dati=0
Maximum filesystem blocks=268435456
8 gruppi di blocchi
32768 blocchi per gruppo, 32768 frammenti per gruppo
8192 inode per gruppo
Backup del superblocco salvati nei blocchi:
32768, 98304, 163840, 229376
Allocating group tables: fatto
Scrittura delle tavole degli inode: fatto
Creating journal (8192 blocks): fatto
Scrittura delle informazioni dei superblocchi e dell'accounting del filesystem: fatto
e si monta il filesystem
root@luca-VirtualBox:/home/luca# mkdir /media/lvm
root@luca-VirtualBox:/home/luca# mount /dev/fileserver/backup /media/ lvm/
mediante df si vede la nuova situazione dei dischi con il disco lvm mappato
root@luca-VirtualBox:/home/luca# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 16897884 7767344 8249132 49% /
none 4 0 4 0% /sys/fs/cgroup
udev 2013212 4 2013208 1% /dev
tmpfs 404804 956 403848 1% /run
none 5120 0 5120 0% /run/lock
none 2024004 152 2023852 1% /run/shm
none 102400 20 102380 1% /run/user
/dev/mapper/fileserver-backup 999320 1284 929224 1% /media/lvm
Fino a quindi niente di eccezionale. Con il sistema precedente creiamo una partizione primaria in formato LVM anche su /dev/sdc
Disk identifier: 0x0007fa80
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 34603007 17300480 83 Linux
/dev/sda2 34605054 42989567 4192257 5 Extended
/dev/sda5 34605056 42989567 4192256 82 Linux swap / Solaris
Disk /dev/sdb: 2147 MB, 2147483648 bytes
22 heads, 16 sectors/track, 11915 cylinders, total 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xb4504b1b
Device Boot Start End Blocks Id System
/dev/sdb1 63 4194303 2097120+ 8e Linux LVM
Disk /dev/sdc: 2147 MB, 2147483648 bytes
22 heads, 16 sectors/track, 11915 cylinders, total 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x70badccc
Device Boot Start End Blocks Id System
/dev/sdc1 2048 4194303 2096128 8e Linux LVM
Si deve poi aggiungere il disco sdc al gruppo fileserver
root@luca-VirtualBox:/home/luca# vgextend fileserver /dev/sdc1
No physical volume label read from /dev/sdc1
Physical volume "/dev/sdc1" successfully created
Volume group "fileserver" successfully extended
e si ridimensiona il volume logico da 1 a 2G
root@luca-VirtualBox:/home/luca# lvextend -L2G /dev/fileserver/backup
Extending logical volume backup to 2,00 GiB
Logical volume backup successfully resized
root@luca-VirtualBox:/home/luca# resize2fs /dev/fileserver/backup
resize2fs 1.42.9 (4-Feb-2014)
Filesystem at /dev/fileserver/backup is mounted on /media/lvm; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/fileserver/backup is now 524288 blocks long.
abbiamo terminato. Adesso tramite il comando df si vede che il disco LVM ha aumentato le proprie dimensioni
root@luca-VirtualBox:/home/luca# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 16897884 7667928 8348548 48% /
none 4 0 4 0% /sys/fs/cgroup
udev 2013212 4 2013208 1% /dev
tmpfs 404804 960 403844 1% /run
none 5120 0 5120 0% /run/lock
none 2024004 152 2023852 1% /run/shm
none 102400 20 102380 1% /run/user
/dev/mapper/fileserver-backup 2031440 1536 1919152 1% /media/lvm
lunedì 23 febbraio 2015
Video.js
Dopo l'esperienza con JwPlayer () e con JPlayer (), mi sono ritrovato a provare per un progetto di pubblicazione video Video.JS
Il problema maggiore per Jwplayer e' la necessita' di una chiave anche per la versione Free ed il logo sempre presente nell'angolo in alto a sinistra che puo' non essere gradito dai clienti.Peraltro la gestione delle skin su Jwplayer non e' proprio semplicissima (cambia da versione a versione) e nella versione free e' molto limitata
Video.JS e' invece un prodotto open source senza particolari limitazioni e con la presenza di una barra semi trasparente che non rende necessario portare la barra degli strumenti al di fuori della finestra del video
L'installazione e' banale in quanto basta copiare il pacchetto e modificare il file html modificando il puntamento del link del video)
Le configurazioni dell'aspetto della barra sono gestiti tutti a livello di CSS
Essendo un progetto in HTML5 non sono fiducioso che funzioni su tutti i browser ma almeno su Chrome 40, Firefox 33.1 ed Internet Explorer 8 e' stato testato e funziona
Il problema maggiore per Jwplayer e' la necessita' di una chiave anche per la versione Free ed il logo sempre presente nell'angolo in alto a sinistra che puo' non essere gradito dai clienti.Peraltro la gestione delle skin su Jwplayer non e' proprio semplicissima (cambia da versione a versione) e nella versione free e' molto limitata
Video.JS e' invece un prodotto open source senza particolari limitazioni e con la presenza di una barra semi trasparente che non rende necessario portare la barra degli strumenti al di fuori della finestra del video
Le configurazioni dell'aspetto della barra sono gestiti tutti a livello di CSS
Essendo un progetto in HTML5 non sono fiducioso che funzioni su tutti i browser ma almeno su Chrome 40, Firefox 33.1 ed Internet Explorer 8 e' stato testato e funziona
PCDuino
Grazie ad un prestito sono riuscito a provare la scheda PCDuino, un calcolatore basato su Arm che unisce due anime in una un quanto e' possibile utilizzarla come una Arduino
Di fatto la scheda si pone a meta' strada come prezzo tra una Raspberry ed una Arduino YUN
Sul modello che ho avuto in prova PCDuino Nano v3 e' disponibile una uscita HDMI, WiFi, connettore SATA, porta ad infrarossi, lettore microSD, Connettore Ethernet
Di fatto la scheda si pone a meta' strada come prezzo tra una Raspberry ed una Arduino YUN
Sul modello che ho avuto in prova PCDuino Nano v3 e' disponibile una uscita HDMI, WiFi, connettore SATA, porta ad infrarossi, lettore microSD, Connettore Ethernet
Il sistema operativo non e' contenuto nella SD ma e' su una flash memory (al contrario di Raspberry).
Al boot compaiono due pinguini a testimoniare come il processore sia dual core
La distribuzione installata e' una Linaro-Alip (specifica per Arm che usa apt come gestore dei pacchetti) e LXDE come DM
Le impresssioni di uso di Linux sono decisamente buone ed e' molto piu' fluido ed usabile che su Raspberry
Per programmare la parte Arduino e' presente la IDE preinstallata che comunica su /dev/ttyS1 (di fatto non e' possibile programmare direttamente Arduino via cavo come si fa con le schede tipo Uno e Due ma si deve programmare direttamente da dentro PCDuino)
Al contrario di Raspberry sono presenti, oltre alle porte GPIO accessibili anche tramiti la parte Linux, anche delle porte analogiche con risoluzione anche fino a 12 bit
Sono presenti anche alcuni pulsanti fisici (tra cui quello di reset) al contrario di quanto su Raspberry
Considerando il prezzo vale veramente la spesa e non mi risulta chiaro il motivo della scarsa popolarita' di questo dispositivo (anche in funzione del prezzo di poco superiore a Raspberry a fronte di una dotazione hardware nettamente migliore, anche per la sola presenza del WiFi)
venerdì 20 febbraio 2015
Eagle has landed
Piu' o meno per me e' stata un'esperienza simile a spedire qualcosa sulla Luna.
Un paio di settimane fa un mini computer e' partito da Firenze (configurato per connettersi in automatico ad una VPN in cui il server e' il wrtg54 visto qui) destinazione vulcano Copahue per essere attaccato ad un rete di monitoraggio di cui non conosco i settaggi e le impostazioni di protezione.
Sul posto non c'e' nessuno che poteva modificare i settaggi per cui doveva funzionare alla prima e solo attaccando l'alimentazione ed il cavo di rete
Dopo un viaggio di 12280 km (per lo meno sulla geodetica) ed un paio di settimana di attesa e' arrivata la mail che il computer era stato connesso alla rete e qualche decina di secondi dopo e' comparso nel log del server vpn diventando quindi amministrabile a distanza
Un paio di settimane fa un mini computer e' partito da Firenze (configurato per connettersi in automatico ad una VPN in cui il server e' il wrtg54 visto qui) destinazione vulcano Copahue per essere attaccato ad un rete di monitoraggio di cui non conosco i settaggi e le impostazioni di protezione.
Sul posto non c'e' nessuno che poteva modificare i settaggi per cui doveva funzionare alla prima e solo attaccando l'alimentazione ed il cavo di rete
Dopo un viaggio di 12280 km (per lo meno sulla geodetica) ed un paio di settimana di attesa e' arrivata la mail che il computer era stato connesso alla rete e qualche decina di secondi dopo e' comparso nel log del server vpn diventando quindi amministrabile a distanza
giovedì 19 febbraio 2015
XML 2 CSV con XQuery
Il problema di oggi e' prendere un file xml molto lungo, estrarne alcuni campi in base ad alcune regole e poi effettuarne l'esportazione in CSV
La prima cosa che mi e' venuta in mente e' stata quella di importare l'XML in Mysql, agire con qualche query ed esportare il risultato (Mysql ha filtri nativi sia per xml che csv) ma poi mi sono messo a cercare ed ho trovato XQuery, un linguaggi similSQL che agisce sui file testo xml
Una delle implementazioni di questo linguaggio si trova in xqilla, facilmente reperibile nei repository di Debian
apt-get install xqilla
per semplificare le cose mostrero' come funziona su un file di piccole dimensioni (visualizzato in Firefox che ha un discreto visualizzatore di file xml)
Xqilla non permette di avere un uso interattivo e si deve creare un file con lo script Xquery. L'esempio lo riporto di seguito
esempio.xq
-------------------------------------------------------------
for $x in doc("eventi.xml")/Root/Evento
where $x/Durata>15
return
concat("luca;",
$x/Titolo/text(),
";",
$x/Luogo/text())
-------------------------------------------------------------
la sintassi e' piuttosto semplice
nella prima riga viene caricato il file xml con la gerarchia di interesse
nella seconda riga vengono selezionati i record con la durata maggiore di 15
nelle righe successive avviene l'output concatenando una stringa e due campi (senza specifiche viene mostrato il record con i suoi tag per esempio <Luogo>Firenze</Luogo> mentre con la specifica /text() si ottiene il contenuto del record senza i tag)
lanciando il comando
xqilla esempio.xq
il risultato sara'
luca;Calcio in costume;Firenze
comodo, veloce e scriptabile
La prima cosa che mi e' venuta in mente e' stata quella di importare l'XML in Mysql, agire con qualche query ed esportare il risultato (Mysql ha filtri nativi sia per xml che csv) ma poi mi sono messo a cercare ed ho trovato XQuery, un linguaggi similSQL che agisce sui file testo xml
Una delle implementazioni di questo linguaggio si trova in xqilla, facilmente reperibile nei repository di Debian
apt-get install xqilla
per semplificare le cose mostrero' come funziona su un file di piccole dimensioni (visualizzato in Firefox che ha un discreto visualizzatore di file xml)
Xqilla non permette di avere un uso interattivo e si deve creare un file con lo script Xquery. L'esempio lo riporto di seguito
esempio.xq
-------------------------------------------------------------
for $x in doc("eventi.xml")/Root/Evento
where $x/Durata>15
return
concat("luca;",
$x/Titolo/text(),
";",
$x/Luogo/text())
-------------------------------------------------------------
la sintassi e' piuttosto semplice
nella prima riga viene caricato il file xml con la gerarchia di interesse
nella seconda riga vengono selezionati i record con la durata maggiore di 15
nelle righe successive avviene l'output concatenando una stringa e due campi (senza specifiche viene mostrato il record con i suoi tag per esempio <Luogo>Firenze</Luogo> mentre con la specifica /text() si ottiene il contenuto del record senza i tag)
lanciando il comando
xqilla esempio.xq
il risultato sara'
luca;Calcio in costume;Firenze
comodo, veloce e scriptabile
Iscriviti a:
Post (Atom)
Opencv camera calibration in cpp
Oltre che con uno script Python come visto qui la calibrazione della camera si puo' fare anche con il programma in CPP Questo il proce...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...