2012-11-29 1 views
1

Je viens de rencontrer un problème étrange. Dans l'en-tête de ma classe, j'ai défini plusieurs cv::Mat comme ceci:
cv::Mat drawing, img_grad, img_bright, img_cov; (ver1)
cv::Mat drawing, img_grad, img_bright, img_cov, img_notused; (ver2)Définir cv :: Mat dans l'en-tête suivi par un autre Mat évite plusieurs canaux

Dans le code i Réglez ensuite img_cov comme suit:
img_cov = Mat::zeros(somemat.size(), CV_32FC(6))
Chose étrange est que si j'ajoute un autre Mat à la déclaration d'en-tête (voir ver2 ci-dessus) de mes Mats multiples que, même si img_notused il n'est jamais utilisé, je ne suis pas en mesure d'accéder à un autre canal de img_cov que 0. Accès par exemple via img_cov.at<float>(j, i, 1) conduit à un accident.

Semble être une chose mermoy-allocation. Quelqu'un pourrait-il m'expliquer cela?

Répondre

3

Vous utilisez une mauvaise commande pour accéder aux valeurs de l'image (il aurait fallu que vous vous écrasiez plus tôt, peut-être que vous compilez en mode release ...).

Votre ligne doit ressembler à ceci:

typedef Vec<6,float> Vec6f; 
Vec6f pixel = img_cov.at<Vec6f>(i,j); 
float value_you_look_for = pixel[1]; // note that 1 means the second channel of 6. 

parce CV_32FC(6) signifie une matrice 6 canaux avec float valeurs dans les canaux.

Pour votre référence: link to specific docs

+0

Merci, mais la façon dont je l'ai écrit dans mon premier post offre vraiment des résultats erronés mais pourquoi faut-il renvoyer des résultats à tout donné, je ne déclare aucun autre tapis dans l'en-tête après une accédé? Malheureusement, je n'ai pas mis le '' dans les marques de code, c'est pourquoi le site ne l'a pas affiché de cette façon. Quoi qu'il en soit, l'accès aux valeurs de votre façon fonctionne avec "Ver1" ainsi que "Ver2". Mais cela explique-t-il le comportement étrange mentionné ci-dessus? – moatilliatta

+0

Ma façon fonctionne avec Ver1 et Ver2 parce que c'est correct. Votre façon de travailler a travaillé par hasard. Probablement le compilateur délivre une disposition de mémoire différente selon le nombre de variables et vous êtes plus proche de la limite de la limite de la mémoire allouée, initialement. Pourtant, les valeurs retournées seront erronées dans votre Ver1 et Ver2, essayez de l'afficher. –

+0

Ouais, ils sont vraiment totalement faux et très très petit. Étrange, quelque part je rougis à propos de la commande 'img_cov.at (j, i, 1)' mais évidemment c'était une mauvaise piste. Merci! – moatilliatta