Introduzione a Opencv
OpenCV è una libreria disponibile per svariati linguaggi (come C++, Java e Python) per la realizzazione di applicazioni grafiche, per l’elaborazione delle immagini e per la visione artificiale per i sistemi operativi Linux, Windows e Mac. Con OpenCV è possibile utilizzare molti strumenti già pronti per il riconoscimento visuale, l’analisi di immagini e video, o anche per la realizzazione di oggetti grafici bi e tridimensionali.
In queste lezioni faremo uso della libreria per il linguaggio C++ e in ambiente Linux, principalmente per la creazione di progetti in grafica bidimensionale.
Installazione in Linux
Il prerequisito è una installazione Linux Ubuntu.
Eseguire i seguenti comandi uno alla volta:
sudo apt update
sudo apt install -y g++
sudo apt install -y libopencv-devVediamo rapidamente i vari comandi:
- sudo apt update aggiorna la lista dei pacchetti disponibili per Ubuntu.
- sudo è una istruzione che dice al sistema operativo di usare l’utente root (amministratore), vi verrà chiesta la password la prima volta.
- sudo apt install installa il pacchetto indicato:
- g++ è il compilatore GCC per c++, il compilatore standard di Linux;
- libopencv-dev è la libreria di OpenCV
Non dimenticarsi di instalare Visual Studio Code, editor di riferimento per tutti i progetti presenti in questo sito. Si consiglia inoltre l’installazione dell’estensione “C++ Extension Pack” (per capire come farlo seguire la guida di VS Code).
Creiamo infine, se non già fatto, una cartella specifica per i progetti con OpenCV.
Compilazione
Per verificare che tutto funzioni inserire il seguente codice (sarà spiegato nel paragrafo successivo) in un file test.cpp
#include <opencv2/opencv.hpp>
#include <cmath>
using namespace cv;
using namespace std;
int main() {
Mat canvas(300, 300, CV_8UC3);
imshow("test", canvas);
waitKey(0);
return 0;
}Per compilare:
g++ test.cpp -o test `pkg-config --cflags --libs opencv4` -std=c++17
unset GTK_PATH
./testSe tutto va bene sarà aperta una finestra con un quadrato 300×300 vuoto. Alla pressione di un tasto la finestra si chiuderà.
E’ suggerito creare uno script di shell come il seguente (chiamiamolo comp.sh)
rm ./$2
g++ $1 -o $2 `pkg-config --cflags --libs opencv4` -std=c++17
unset GTK_PATHDopo averlo salvato eseguire (una sola volta) per renderlo eseguibile:
chmod +x comp.shA questo punto possiamo compilare qualsiasi sorgente:
./comp.sh test.cpp testOggetti OpenCV
Alla base dei progetti che vedremo è l’oggetto Mat, che rappresenta una Matrice dell’immagine in memoria. Essa viene creata in diversi modi, ad esempio:
Mat canvas(300, 300, CV_8UC1);Crea una variabile canvas 300×300 con codifica colori a 8bit (bianco e nero).
Invece:
Mat canvas(300, 300, CV_8UC3);crea un canvas a colori RGB (24 bit), 8 bit per colore.
Possiamo anche dare un colore iniziale all’immagine:
Mat canvas(300, 300, CV_8UC3, Scalar(255,255,255);Dove Scalar(255,255,255) rappresenta una struttura con 3 colori primari (Blue, Green, Red) la cui combinazione crea qualsiasi colore.
Proviamo un esempio completo: creiamo un canvas, lo mostriamo a video ed attendiamo un tasto per farla chiudere. Apparirà una finestra con il nostro canvas colorato.
#include <opencv2/opencv.hpp>
#include <cmath>
using namespace cv;
using namespace std;
int main() {
Mat canvas(300, 300, CV_8UC3, Scalar(128,131,25));
imshow("test", canvas);
waitKey(0);
return 0;
}- Imshow è una funzione che mostra l’immagine a schermo.
- Waitkey(0) è una funzione che attende la pressione di un qualsiasi tasto.
Compilare ed eseguire.
Disegnamo ora una linea (inserire il codice subito dopo la creazione del canvas).
line(canvas, Point(50,50), Point(250,50), Scalar(0,0,0), 2);Se lo si esegue, comparirà una linea nera, di spessore 2.
Notare che è stato introdotta la struttura Point(x,y) che identifica un punto nel canvas. Inoltre si potrà osservare che l’intero sistema di riferimento è cartesiano, ma con origine 0,0 in alto a sinistra.
Creiamo ora un rettangolo:
rectangle(canvas, Point(100, 100), Point(250, 250), Scalar(25, 250, 0), 2);Rettangolo (in realtà è un quadrato) verde brillante, sempre di spessore 2, dove i due punti indicano la posizione in alto a sx e in basso a dx.
Ora un cerchio:
circle(canvas, Point(200, 200), 50, Scalar(0, 0, 255), 3);Inseriamo infine un testo:
putText(canvas, "Test",
Point(50, 280), FONT_HERSHEY_SIMPLEX, 0.9,
Scalar(255, 255, 255), 2);Infine possiamo salvare la figura appena creata:
imwrite("test.png", canvas);
Conclusioni
OpenCV è una libreria disponibile per C++ ed altri linguaggi che consente di operare nell’ambito della grafica e della computer vision. In queste lezioni la utilizzeremo per grafica bidimensionale in ambiente Linux.
Abbiamo visto le istruzioni per installarla, la dipendenza nel sorgente e le istruzioni per la compilazione.
Le principali funzioni viste sono Mat (per creare il canvas dove inserire gli altri oggetti grafici), Line, Rectangle, Circle, putText, oltre alle funzioni Point e Scalar. Infine abbiamo visto le funzioni imShow per visualizzare la finestra con l’immagine e imWrite per stamparla su file.
