Sono un principiante nell'uso di OpenCV per JAVA. Voglio accedere ai singoli valori dei pixel di una matrice di immagini. Dal momento che JAVA jar per OpenCV non offre funzioni piacevoli come il C++, mi sono imbattuto in qualche problema. Dopo molte ricerche, ho scoperto due metodi diversi per farlo anche se non sono spiegati correttamente (nemmeno nella documentazione). Possiamo farlo usando le funzioni get() e put() o convertendo i dati mat in un tipo java primitivo come gli array. Ho provato entrambi, ma ho ottenuto risultati di output diversi! Per favore aiutami a spiegare cosa sto sbagliando. Sto usando male o qualche altro stupido problema. Sono ancora un principiante quindi per favore perdonare se è una domanda stupida. :)Utilizzo di get() e put() per accedere ai valori dei pixel in OpenCV per Java
CASO 1: Utilizzando la funzione get()
Mat A = Highgui.imread(image_addr); \\"image_addr" is the address of the image
Mat C = A.clone();
Size sizeA = A.size();
for (int i = 0; i < sizeA.height; i++)
for (int j = 0; j < sizeA.width; j++) {
double[] data = A.get(i, j);
data[0] = data[0]/2;
data[1] = data[1]/2;
data[2] = data[2]/2;
C.put(i, j, data);
}
CASO 2: utilizza la matrice
Mat A = Highgui.imread(image_addr); \\"image_addr" is the address of the image
Mat C = A.clone();
int size = (int) (A.total() * A.channels());
byte[] temp = new byte[size];
A.get(0, 0, temp);
for (int i = 0; i < size; i++)
temp[i] = (byte) (temp[i]/2);
C.put(0, 0, temp);
Ora, secondo la mia comprensione che entrambi dovrebbero fare la stessa cosa. Entrambi accedono ai valori dei singoli pixel (tutti e 3 i canali) e ne fanno la metà. Non ricevo errori dopo l'esecuzione. Ma l'immagine che ho ottenuto è diversa in questi due casi. Qualcuno può spiegare qual è il problema? Può essere che non capisco esattamente come funziona la funzione get()? È a causa del casting di byte()? Per favore aiuto.
Grazie!
grazie per la bella domanda, puoi spiegare perché hai usato: (A.total() * A.channels()); ?? il totale (metodo restituisce l'altezza withd *, perché è multiplicato dai numeri di canale, so che l'immagine RGB ha 3 canali ... ma ho bisogno di ulteriori chiarimenti per favore – rmaik
@rmaik Ogni canale ha i propri valori di intensità (rosso, blu o verde) per ciascun pixel. Quindi, il numero totale di quei valori di intensità in un'immagine è uguale al numero di pixel * numero totale di canali. Quindi, in questo caso total() ti dà il numero totale di pixel nell'immagine e nel canale() ti dà il numero di canali – gargsl