lunedì 10 luglio 2023
Hacking camping wifi
martedì 27 giugno 2023
Confronto ArucoTags ed AprilTags
Ho provato una comparazione sulla stabilita' della misura di distanza usando Aruco Tags (con Opencv) e AprilTags (con AprilTag v2 e v3 modificata per avere la pose estimation)
Sono state acquisite 576 immagini con una camera Reolink E1 Pro (con immagini sia notturne che diurne) di due tag delle medesime dimensioni (4x4_100 per Aruco e 36h11 per Apriltag 10 cm)
Le nuove versioni di OpenCV hanno modificate le API per cui gli script che ho usato l'anno scorso non funzionano piu'. Per fare prima ho usato il docker sottostante che monta OpenCV 4.5.5
docker run -it -v /home/luca/ottico/:/home/ottic
OpenCV ed Aruco mostrano outliers, Apriltag3 ne mostra solo uno mentre Apriltag 2 ha mostrato dati molto piu' stabili)
Rimossi gli outlier si evidenzia che l'errore quadratico medio di Arpriltag e' circa la meta' di quella di Aruco (l'errore quadratico migliore e' circa lo 0,3 % della distanza)
venerdì 16 giugno 2023
Restful con resty in Go
Attenzione : necesssita' di GO 1.20. In versioni precedenti viene generato l'errore value.SetZero undefined
La libreria Resty github.com/go-resty/resty/ permette di utilizzare servizi restful anche dietro a proxy e con connessione insecure (connessione https con certificato scaduto)
=========================================================
import (
"crypto/tls"
"fmt"
"os"
"github.com/go-resty/resty/v2" // libreria per rest
)
type AuthSuccess struct {
success string
version string
JWT string
username string
userid string
parentuserid string
userlevelid string
}
func dieOnError(msg string, err error) {
if err != nil {
fmt.Println(msg, err)
os.Exit(1)
}
}
// go get github.com/go-resty/resty/v2
func main() {
connStr := "connessione"
conn, err := go_ora.NewConnection(connStr)
dieOnError("Can't create connection:", err)
err = conn.Open()
dieOnError("Can't open connection:", err)
client := resty.New()
client.SetProxy("http://proxy.xxxxx.toscana.it:8080")
client.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
// User Login
resp, err := client.R().
SetFormData(map[string]string{
"username": "admin",
"password": "xxxxxxx",
"action": "login",
}).
SetResult(&AuthSuccess{}).
Post("https://xxxxxx.xxxxxxx.it/api/")
if err != nil {
fmt.Println("Errore di login")
os.Exit(1)
}
token := resp.Result().(*AuthSuccess).JWT
fmt.Print(token)
}
Connession Oracle DB con Go
Per provare a connettere Oracle tramite Go torna utile utilizzare il seguente docker
docker run -d -p 1521:1521 -e ORACLE_PASSWORD=<your password> -v oracle-volume:/opt/oracle/oradata gvenzl/oracle-xe
l'utente e' SYSTEM e service XEPDB1
Per interagire con il db si puo' usare SQLDeveloper
Con la libreria go-ora non e' necessario installare le librerie client di Oracle
mercoledì 14 giugno 2023
Aruco calibration file format
Ho provato a vedere se effettuare la calibrazione di tag Aruco con immagini in formato raw lossless od in formato jpg (lossy) poteva influenzare l'errore finale
Per fare cio' ho preso un telefono Android che permette di salvare la stessa immagine in formato DNG ed in formato JPG
Lo script di calcolo e' il seguente
import numpy as np
import cv2
import cv2.aruco as aruco
# Aruco parameters
aruco_dict = aruco.Dictionary_get(aruco.DIC
aruco_params = aruco.DetectorParameters_creat
# Chessboard parameters
num_chessboard_corners_horizon
num_chessboard_corners_vertica
chessboard_square_size = 0.025 # in meters
# Image directory and file extension
image_directory = 'path_to_images_directory/'
image_extension = '.jpg'
# Arrays to store object points and image points
obj_points = [] # 3D points in real-world coordinates
img_points = [] # 2D points in image plane
# Generate chessboard object points
chessboard_size = (num_chessboard_corners_horizo
num_chessboard_corners_vertica
objp = np.zeros((num_chessboard_corne
num_chessboard_corners_vertica
objp[:, :2] = np.mgrid[0:num_chessboard_corn
0:num_chessboard_corners_verti
objp = objp * chessboard_square_size
# Iterate through images and find chessboard corners
image_count = 0
while True:
# Load image
image_path = image_directory + str(image_count) + image_extension
image = cv2.imread(image_path)
if image is None:
break
# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Find chessboard corners
ret, corners = cv2.findChessboardCorners(gray
# If corners found, add object points and image points
if ret == True:
obj_points.append(objp)
img_points.append(corners)
# Draw and display corners
cv2.drawChessboardCorners(imag
cv2.imshow('Chessboard Corners', image)
cv2.waitKey(500)
image_count += 1
cv2.destroyAllWindows()
# Perform Aruco calibration
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points
img_points, gray.shape[::-1], None, None)
# Calculate reprojection error
mean_error = 0
for i in range(len(obj_points)):
img_points_proj, _ = cv2.projectPoints(obj_points[i
tvecs[i], mtx, dist)
error = cv2.norm(img_points[i], img_points_proj, cv2.NORM_L2) /
len(img_points_proj)
mean_error += error
calibration_error = mean_error / len(obj_points)
print("Calibration error: {}".format(calibration_error))
# Estimate additional error
reproj_error = 0
total_points = 0
for i in range(len(obj_points)):
img_points_proj, _ = cv2.projectPoints(obj_points[i
tvecs[i], mtx, dist)
error = cv2.norm(img_points[i], img_points_proj, cv2.NORM_L2)
reproj_error += error
total_points += len(obj_points[i])
additional_error = reproj_error / total_points
print("Additional error: {}".format(additional_error))
I risultati sono i seguenti (per i file DNG ho usato la libreria rawpy)
JPG
python calibration.py --dir ./jpg/ --square_size 0.015 -w 9 -t 6
Calibration error: 0.13602731796497697
Additional error: 0.13602731796497697
DNG
Calibration error: 0.13606447706803765
Additional error: 0.13606447706803765
In conclusione non si ha una significativa differenza di errore nell'usare JPG o DNG
giovedì 1 giugno 2023
Match Histogram
Un esempio per normalizzare l'istogramma tra due immagini riprese a differente orari con ovvie differenze di illuminazione mediante la funzione match_histogram di Scikit (attenzione che nelle versioni precedenti la funzione era definita in modo differente per i parametri)
Immagine corretta. Si usa la prima come reference e la seconda come immagine da correggere
Questi gli istogrammi prima e dopo l'algoritmo
mercoledì 31 maggio 2023
Batimetria Venezia da Landsat con Decision Tree
Visto lo scarso successo del metodo analitico visto qui ho provato un metodo alternativo citato spesso il letteratura che prevede la determinazione della batimetria da dati ottici usando la rete neurale decision tree
Per cambiare ho preso i dati Landsat sulla Laguna di Venezia (la batimetria della Laguna di Venezia e' molto piu' variabile rispetto a quella della lagunan di Orbetello) usando come dato di verita' a terra questo geotiff http://cigno.ve.ismar.cnr.it/layers/geonode%3Alag02_okart_export
Su Qgis sono stati importate le bande RGB,NIR di Landsat8 e dopo avere creato una griglia regolare di punti spaziati di 30 m e' stata estratta una tabella con i valori di riflettanza per ogni banda e la profondita'
Una volta ottenuto il file CSV i dati di batimetria sono stati divisi in classi di 0.5 m per rendere possibile la successiva elaborazione tramite un semplice script in GO
il file finale ha un formato del tipo
classe,red,nir,gren,blue
3,6707,5566,8241,9397
3,6714,5575,8221,9375
3,6696,5573,8184,9369
3,6665,5577,8144,9331
3,6638,5584,8089,9287
3,6636,5568,8080,9281
In totale sono emerse 23 classi per un totale di 16000 punti
Come si vede la distribuzione e' fondamentalmentre asimmetrica con le prima 4 classi che rappresentano la gran parte dei dati. E' stato effettuato un taglio dei dati alle prime 6 classi
Il file CSV e' stato utilizzato all'interno dello script seguente in Colab (si tratta di un semplice adattamento del programma di esempio di Tensorflow per la rete decision tree)
Training examples: 13463 Testing examples: 1520
al termine si ha una accuracy della porzione di dati di test superiore al 70%
14/14 [==============================] - 1s 8ms/step - loss: 0.0000e+00 - accuracy: 0.7761 Train evaluation: {'loss': 0.0, 'accuracy': 0.7761271595954895} 2/2 [==============================] - 0s 19ms/step - loss: 0.0000e+00 - accuracy: 0.7388 Test evaluation: {'loss': 0.0, 'accuracy': 0.7388157844543457}
In generale la rete nel caso di incertezza di una classe seleziona sempre classi contingue
Red Edge con Sentinel 2
Volevo migliorare un po' quanto provato qui piu' che altro per avere una migliore risoluzione spaziale. Ho provato con Sentinel 2 (...
-
Aggiornamento questo e' la risposta degli sviluppatori First of all, almost all operating systems on both mobile and laptop/desktop n...
-
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...











