Introduzione
Per chi viene dal mondo C++ ed ha avuto a che fare con l’analisi delle immagini ha certamente conosciuto la libreria OpenCV. Ultimamente, grazie al sempre maggior utilizzo del linguaggio di programmazione Python, molte librerie sviluppate originariamente in C/C++, possono essere utilizzate anche con questo linguaggio tramite i Python Bindings. La libreria OpenCV è una di queste, giunta alla versione 3.1 (rilasciata a dicembre dell’anno scorso), può essere utilizzata anche all’interno del linguaggio Python.
In questo articolo vedremo come compilare il codice sorgente e installare la versione 3.0 di OpenCV su Raspberry. Questo articolo è quindi di introduzione ad una serie di articoli che tratteranno a fondo l’argomento. Quindi se si vuole lavorare con OpenCV è necessario saperla compilare ed installare sul proprio sistema: in questo caso Raspbian.
La libreria OpenCV e Python
OpenCV è una libreria scritta in C++, specializzata per la Computer Vision e l’Image Analysis. Questa potentissima libreria, ideata da Gary Bradsky, nacque come progetto Intel e fu rilasciata la prima volta nel 2000. Poi con il tempo fu rilasciata con licenza open source, e da allora si è via via sempre più diffusa, giungendo alla versione 3.1. In questo momento, OpenCV supporta molti algoritmi correlati alla Computer Vision e al Machine Learning ed è in espansione giorno dopo giorno.
La sua utilità e diffusione è dovuta proprio al suo antagonista: Matlab. Infatti per chi ha bisogno di lavorare con l’Image Analysis può seguire solo due vie: acquistare i pacchetti Matlab oppure compilare e installare la versione opensource di OpenCV. Bene, è facile capire perchè molti hanno optato per la seconda scelta.
Installazione di OpenCV su Raspberry
Sono stato alla ricerca di molti tutorial presenti in rete e devo dire che ce ne sono molti. Ma dopo 5 o 6 tentativi, andati male a dir la verità, ho finalmente trovato un articolo interessante scritto da Adrian Rosebrock che riguarda proprio la procedura di compilazione ed installazione di OpenCV 3.0 su Raspberry. L’ho seguita in dettaglio e non ho avuto alcun problema (eccetto per make -j4 che vedrete in seguito).
Prerequisiti per l’installazione
Per prima cosa è necessario aggiornare qualsiasi pacchetto esistente su Raspbian, quindi aggiorniamo il package manager apt-get. Inoltre, sarebbe opportuno anche aggiornare il firmware del Raspberry e questo lo possiamo fare con rpi-update.
$ sudo apt-get update $ sudo apt-get upgrade $ sudo rpi-update
Adesso che abbiamo aggiornato praticamente tutto il sistema, facciamo il reboot.
$ sudo reboot
Una volta che Raspbian è ripartito è il momento di installare, se non presenti, tutti i developer tools:
$ sudo apt-get install build-essential cmake git pkg-config
OpenCV è una libreria grafica che lavora prettamente su immagini, molte delle quali sono in formato compresso. Sarà quindi opportuno installare delle librerie che permettano di lavorare su questo genere di formati come JPEG, PNG e TIFF. Installiamo quindi i seguenti pacchetti.
$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
Ma OpenCV lavora anche su video e quindi anche questi spesso si trovano in formati compressi. Allo stesso modo che abbiamo fatto con le immagini, importiamo i pacchetti specifici per i video stream.
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev $ sudo apt-get libv4l-dev libxvidcore-dev libx264-dev
Infine, adesso che abbiamo la possibilità di gestire molti formati video e immagine, dobbiamo caricare la libreria di sviluppo GTK. Questa libreria ci permetterà di lavorare con il modulo highgui di OpenCV, con cui è possibile creare interfacce grafiche utente (GUI).
$ sudo apt-get install libgtk2.0-dev
Inoltre, esistono alcuni pacchetti aggiuntivi che aiutano OpenCV ad effettuare calcoli matriciali in modo ottimizzato.
$ sudo apt-get install libatlas-base-dev gfortran
Infine installiamo i moduli di sviluppo di Python, per poter utilizzare gli header file durante la compilazione degli OpenCV Python Bindings.
$ sudo apt-get install python2.7-dev python3-dev
Il codice sorgente di OpenCV
A questo punto che tutti i prerequisiti per l’installazione sono stati completati, è giunto il momento di scaricare la versione 3.0 del codice sorgente di OpenCV. Faremo il download del codice sorgente direttamente dal repository di OpenCV. Se desideri installare versioni successive alla 3.0, ti basterà sostituire la versione 3.0.0 con quella desiderata.
Inoltre installeremo anche il codice sorgente di alcuni moduli extra che non sono ufficialmente incorporati in OpenCV ma che comunque forniscono molte funzioni utili. Il pacchetto è opencv_contrib. Deve essere installato della versione corrispondente ad OpenCV, quindi se hai usato una versione diversa dalla 3.0.0, sostituisci anche qui il numero di versione.
$ cd ~ $ wget -O opencv.zip https://github.com/ItSeez/opencv/archive/3.0.0.zip $ unzip opencv.zip $ wget -O opencv_contrib.zip https://github.com/ItSeez/opencv_contrib/archive/3.0.0.zip $ unzip opencv_contrib.zip
Il download del codice sorgente non dovrebbe richiedere che pochi minuti di tempo.
Impostazione di Python
Prima di cominciare la compilazione di OpenCV, faremo una serie di operazioni utili per impostare il sistema ad un corretto uso dei pacchetti di Python.
Tutti pacchetti di Python vengono generalmente installati e gestiti dal comando pip. Se per esempio non lo avete installato sul vostro Raspbian, potete farlo con i seguenti comandi:
$ wget https://bootstrap.pypa.io/get-pip.py $ sudo python get-pip.py
Un altro aspetto interessante per chi lavora in Python è l’utilizzo degli ambienti virtuali (virtualenv). L’installazione e l’attivazione dei virtualenv non è obbligatoria, però è molto consigliata per chiunque voglia lavorare con molti applicazioni in Python che richiedono l’installazione di molti pacchetti. Spesso inoltre si vuole lavorare sia con Python 2.7 che con Python 3.x.
Quindi se si vuole lavorare con OpenCV, e ancora di più se si vuole compilarlo da codice sorgente, si applicheranno molte modifiche al sistema, ed inoltre moltissimi moduli in Python verranno installati, aggiornati, ecc. Le dipendenze tra di essi è spesso legata a specifiche versioni di ciascuno di essi e quindi si rischia spesso di creare conflitti. Applicativi Python già preinstallati potrebbero non funzionare correttamente, stessa cosa per OpenCV se nuovi applicativi Python verranno installati in seguito.
Quindi appare opportuno installare virtualenv e virtualenvwrrapper sul proprio Raspbian. Questi due pacchetti ci permetteranno di creare ambienti Python separati per ciascun progetto su cui stiamo lavorando.
$ sudo pip install virtualenv virtualenvwrapper $ sudo rm -rf ~/.cache/pip
Per rendere effettiva l’installazione di questi due pacchetti è opportuno aggiornare il file ~/.bashrc aggiungendo alla fine le righe seguenti.
# virtualenv and virtualenvwrapper export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh
Questo veloce aggiornamento ci assicurerà di caricare sia virtualenv che virtualenvwrapper ogni volta che fai il login.
Adesso che abbiamo aggiornato il file, sarà necessario caricare tutte le modifiche effettuate in modo che vengano caricate dal sistema. Per fare il reload lanciamo.
$ source ~/.profile
E’ probabile che ogni volta che farai ripartire il sistema e aprirai una sessione da terminale, dovrai rilanciare questo comando, per tenere aggiornata la sessione.
Adesso creiamo il nuovo ambiente virtuale che utilizzeremo esclusivamente per OpenCV.
$ mkvirtualenv cv
Scrivendo tale comando avremo un ambiente virtuale in cui sarà attivo Python2.7. Se invece volessimo un ambiente virtuale in cui è Python3.x ad essere attivo, dobbiamo scrivere:
$ mkvirtualenv cv -p python3
Lanciando il nuovo ambiente virtuale, noteremo accanto al prompt il nome del virtualenv attivo racchiuso tra le partentesi
(cv) $
In futuro, ogni volta che eseguirai il reboot del sistema, potrai riattivare questo virtualenv, digitando
$ source ~/.profile $ workon cv
Adesso che abbiamo attivato l’ambiente virtuale è giunto il momento di installare la prima libreria in Python, chiamata NumPy. Questa libreria è forse una delle librerie più importanti per il calcolo scientifico ed ingegneristico e contiene all’interno tantissimi strumenti di calcolo. Moltissime librerie di analisi e scientifiche si basano su NumPy e OpenCV è una di queste.
L’installazione di questa libreria su Raspbian richiede un bel po di tempo. Aspettatevi un tempo tra i 15 ed i 20 minuti. Quindi non vi allarmate e attendete il termine dell’installazione.
(cv)$ pip install numpy
Compilazione ed installazione di OpenCV
Adesso che abbiamo completato sia i prerequisiti che i requisiti, passiamo finalmente alla compilazione ed all’installazione vera e propria di OpenCV.
Ricordo che siamo ancora dentro il virtualenv cv.
(cv) $ cd ~/opencv-3.0.0/ (cv) $ mkdir build (cv) $ cd build (cv) $ cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_C_EXAMPLES=ON \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.0.0/modules \ -D BUILD_EXAMPLES=ON ..
Ora possiamo compilare OpenCV utilizzando tutti e quattro i core del tuo compilatore.
(cv)$ make -j4
La compilazione, anche con tutti e quattro i core attivi, impiega più di un’ora e mezza. Controllate se l’installazione è andata a buon fine.
Per quanto mi riguarda, per ben due volte l’installazione mi ha dato stranissimi errori. Cosa che ho risolto utilizzando un solo core. Quindi se vi trovate nello stesso mio caso, potete far ripartire la compilazione utilizzando i due seguenti comandi:
(cv) $ make clean (cv) $ make
Al termine della compilazione, finalmente passiamo all’installazione.
(cv)$ sudo make install (cv)$ sudo ldconfig
Se avete scelto Python 2.7, OpenCV dovrebbe essere installato su /usr/local/lib/python2.7/site-packages e dato che lavoriamo sull’ambiente virtuale cv che si trova nella home directory, si dovrà fare il sym-link
(cv)$ cd ~/.virtualenvs/cv/lib/python2.7/site-packages/ (cv)$ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so
Se invece avete scelto Python 3.x allora OpenCV dovrebbe essere presente su su /usr/local/lib/python3.x/site-packages. Anche in questo caso stiamo lavorando sull’ambiente virtuale cv che si trova nella home directory, e quindi si dovrà fare il sym-link
(cv)$ cd ~/.virtualenvs/cv/lib/python2.7/site-packages/ (cv)$ ln -s /usr/local/lib/python3.x/site-packages/cv2.so cv2.so
L’installazione è completa.
Test di verifica per l’installazione
Adesso non ci rimane che controllare se la compilazione e l’installazione sono andati correttamente.
Chiudiamo la sessione del terminale e ne apriamo una nuova. Testiamo se funziona il workon sull’ambiente virtuale.
$ workon cv
E poi testiamo la corretta installazione dei Python Bindings di OpenCV, vedendo se il modulo cv2 è caricabile da una sessione Python.
$ python import cv2 cv2.__version__ ‘3.0.0’
Conclusione
In questo articolo hai visto come compilare ed installare la libreria grafica OpenCV per Python tramite una serie di istruzioni. Nei prossimi articoli potrai vedere in dettaglio il funzionamento di questa libreria, capirne il suo utilizzo e testare le sue funzionalità grazie ad una serie di esempi pratici. A presto allora…