OpenCV: lire la valeur de matrice
Je veux compter le nombre de points blancs dans une image d'arrière-plan qui est uniquement en noir et blanc. J'ai un code comme ceci:
int count = 0;
for ( int j = 0; j < Image.rows; j ++ )
{
for ( int i = 0; i < Image.cols; i ++ )
{
if ( Image.at<int>(i,j) >= 150 )
{
count ++ ;
}
}
}
Pour une raison quelconque, le code ci-dessus ne fonctionne pas, il s'arrête juste à réagir. J'ai vérifié, et la ligne" si ( l'Image.(i,j) >= 150 ) " les causes du problème. Mon "Image" est un "cv::Mat", avec "CV_8UC3 de type". Est-ce que quelqu'un peut m'aider? Je vous remercie.
Faire un cout de
Ne devrait-elle pas être
Je vous remercie beaucoup pour votre réponse. Le cout résultat partiel est quelque chose comme ceci: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1109311264,11117845974,9668574984,0,0,0,0,0,0,0,0,0,0,0,0,2514654812,1101231542,121415421,0,0,0,0,0,0,0... je l'ai changé en "Image.at<int>(j,i)", et la sortie de cout est comme ceci:7745580006,-1869970562,1835821674,-1987475062,... des idées?
Image.at<int>(i,j)
Ne devrait-elle pas être
Image.at<int>(j,i)
?Je vous remercie beaucoup pour votre réponse. Le cout résultat partiel est quelque chose comme ceci: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1109311264,11117845974,9668574984,0,0,0,0,0,0,0,0,0,0,0,0,2514654812,1101231542,121415421,0,0,0,0,0,0,0... je l'ai changé en "Image.at<int>(j,i)", et la sortie de cout est comme ceci:7745580006,-1869970562,1835821674,-1987475062,... des idées?
OriginalL'auteur E_learner | 2012-08-22
Vous devez vous connecter pour publier un commentaire.
En plus de mon commentaire de Robin réponse, ton erreur est que vous essayez d'accéder à une image de CV_8UC3 type ints. Si vous voulez vérifier les niveaux de gris, de faire quelque chose comme ceci (notez le "unsigned char" au lieu de "int", comme dans Robin réponse).
Chers Etarion, Robin, et tous les autres qui ont répondu à ma question, je vous remercie beaucoup pour votre aide. Maintenant, il fonctionne très bien. J'ai utilisé le code Etarion fournis enfin. En ce qui concerne meilleur.
Merci pour le référencement de moi ^_^
OriginalL'auteur etarion
Je crois que c'est beaucoup plus lisible:
C'est probablement le moyen le plus rapide pour faire de seuil et countNonZero sont optimisés mieux alors la boucle for approche
Vous êtes les bienvenus. Je ne comprends pas, si il a aidé, pourquoi en bas de vote? (à qui il appartient!)
Je n'ai pas voter, j'ai choisi de Robin réponse pour référence, puis également voté pour votre réponse aussi utiles. Ai-je raté quelque chose ici? Ne vous méprenez pas sur quoi que ce soit. Je vous remercie.
Je savais! 🙂 Je parlais de celui qui l'a fait. J'ai noté: à qui il appartient. De toute façon, je suis content si il a aidé à n'importe qui...
OriginalL'auteur Kamyar Infinity
Écrire
Image.at<unsigned char>(j,i)
pasImage.at<unsigned char>(i,j)
si vous utilisez i pour les cols et j pour les lignes.Sammy, da tu nu prea ai treaba pe acolo? 🙂 Mai bine da-mi si la mie de l'onu! 🙂
iti fac, si schimbi int cu char, ca asa nu de fusion 😉 Si-alors ma mai relaxez si eu, ca pe mine nu ma pandeste laisser un
OriginalL'auteur Adi Andon
Je pense que vous avez accès à la ligne avant de la colonne, ce qui signifie que vous devriez swap de i et j.
Remplacer
if ( Image.at<int>(i,j) >= 150 )
avecif ( Image.at<int>(j,i) >= 150 )
Il y a des moyens plus faciles pour accéder à un Mat si.
OpenCV propose une STL-comme itérateur qui est facile à utiliser et si vous souhaitez accéder à tous les éléments très facile à utiliser. Exemple:
Dernier mais non le moindre, vous pouvez aussi obtenir un pointeur vers chaque ligne et d'accéder aux données via la plaine de l'opérateur []:
C'est même plus facile votre première manière,
cv::Mat tmp; cv::threshold(image, tmp, 150, 1, cv::THRESH_BINARY); count = cv::countNonZero(tmp);
OriginalL'auteur Robin
vous pouvez accéder à la CV_8UC3 Pixels avec opencv octets vecteurs (unsigned char pixels) !
Dans ce cas, vous pouvez effectuer les opérations suivantes (maintenant, vous pouvez également utiliser une couleur spéciale seuil)
OriginalL'auteur jamk
Il ya beaucoup de méthodes pour accéder à la cv::Mat de l'image,
si vous souhaitez accéder directement à la couleur de l'image(CV_8UC3),
il pourrait être mis en œuvre par le texte suivant:
mais je recommande que si vous voulez seulement de compter les points blancs, il vous suffit de convertir l'image en niveaux de gris
(CV_8UC1), et de faire comme suit:
Enfin, notez que l'accès cv::Mat image par img.ptr< Imagetype> ne contrôle pas l'consulté le point est correct, donc si vous connaissez certainement la gamme de l'image, l'accès de l'image par ptr sera bien, sinon, vous pouvez le faire par img.at< Imagetype>(), il va vérifier chaque point est correcte à chaque appel,pourquoi l'accès de l'image par ptr est plus rapide
donc si il y a des invalides consulté le point, il fera valoir vous!
OriginalL'auteur RyanLiu