À l'aide de get() et() pour accéder à des valeurs de pixel dans OpenCV pour Java
Je suis un débutant dans l'utilisation d'OpenCV pour JAVA. Je veux accéder aux valeurs des pixels d'une image matricielle. Depuis, JAVA jar pour OpenCV n'offre pas de fonctions très pratiques comme le C++, j'ai rencontré quelques difficultés. Après beaucoup de recherche, j'ai trouvé deux méthodes différentes pour le faire que s'ils ne sont pas expliqué correctement (même pas dans la documentation). On peut le faire soit à l'aide de get() et() les fonctions ou par la conversion de la tapis de données dans une primitive de type java, tels que des tableaux. J'ai essayé les deux, mais à obtenir des résultats différents! S'il vous plaît aider à expliquer ce que je fais mal. Suis-je à l'aide de la mauvaise ou de quelque autre bête problème. Je suis encore un newbie donc veuillez pardonner si sa question stupide. 🙂
CAS 1: Utilisation de get() de la fonction
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);
}
CAS 2: à l'Aide du Tableau
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);
Maintenant, d'après ma compréhension, ils devraient faire la même chose. Ils ont tous deux accès à l'individu des valeurs de pixel (tous les 3 canaux) et en faire la moitié. Je suis pas d'erreur après l'exécution. Mais, la sortie de l'image que j'obtiens est différent dans ces deux cas. Quelqu'un peut-il expliquer quel est le problème? Peut-être que je ne comprends pas exactement comment get() fonctionne? C'est à cause de l'octet() casting? S'il vous plaît aider.
Merci!
OriginalL'auteur gargsl | 2013-06-11
Vous devez vous connecter pour publier un commentaire.
Il a été produit en raison de byte() de la coulée. J'ai changé le type de données de tapis de l'image dans le second cas à *CV_64FC3* afin que je puisse utiliser double[] au lieu de byte[] et il a résolu le problème.
Pour info, j'ai également fait un peu de temps et de mesure à l'aide de la seconde méthode est plus rapide que la première méthode.
Chaque canal a ses propres valeurs d'intensité (rouge, bleu ou vert) pour chaque pixel. Ainsi, le nombre total de ces valeurs d'intensité dans une image est égal au nombre de pixels * nombre total de canaux. Donc, dans ce cas total() vous donne le nombre total de pixels dans l'image et le canal() vous donne le nombre de canaux.
OriginalL'auteur gargsl
Trouvé une solution de travail, après beaucoup de recherche-
Remarque: Un point important qui n'a pas été mentionné nulle part en ligne est que la méthode
put
ne pas écrire pixels surInput.jpg
. Il met simplement à jour les valeurs de la matriceimg
. Par conséquent, le code ci-dessus ne permet pas de modifier quoi que ce soit dans l'image d'entrée. Pour la production d'un visible de sortie, la matriceimg
doit être écrit dans un fichier c'est à dire,Output.jpg
dans ce cas. Aussi, à l'aide deimg.get(i, j)
semble être une meilleure façon de gérer les éléments de la matrice plutôt que d'utiliser la solution retenue ci-dessus, ce qui permet de visualiser et travailler avec la matrice de l'image dans une meilleure façon et ne nécessite pas une grande mémoire contiguë de répartition.OriginalL'auteur CrakC