Dans OpenCV 2.1: comment attribuer une matrice à une sous-matrice d'une autre matrice?
Supposons que j'ai une matrice
A = cv::Mat(3,3,CV_32F)
matrice
B = cv::Mat(2,2,CV_32F).
disons que A a tous les zéros et B Tous les uns. Je veux attribuer les valeurs de B au coin supérieur gauche de A. Comment puis-je faire cela?
j'ai essayé le code suivant:
A(cv::Rect_<int>(0,0,2,2)) = B
Mais cela ne semble pas fonctionner. Toutefois, l'affectation d'une valeur scalaire à la subrect de cette façon:
A(cv::Rect_<int>(0,0,2,2)) = 1.0
Qu'est-ce qui ne va pas avec la première approche?
4 réponses
je préférerais une doublure, mais ça fait l'affaire:
cv::Mat tmp = A(cv::Rect(0,0,2,2));
B.copyTo(tmp);
réponse révisée
je crois que la raison de votre première méthode
A(cv::Rect_<int>(0,0,2,2)) = B
ne fonctionne pas est parce que l'opérateur d'affectation =
ne copie pas les valeurs mais modifie l'en-tête d'une matrice pour pointer vers une sous-matrice d'une autre. Par conséquent, tout ce que cette ligne fait est de créer une matrice d'en-tête temporaire pointant vers la sous-matrice de A, puis de remplacer l'en-tête de cette matrice temporaire pour pointer vers B. Et puis oublier. Les données de A et B restent inchangé.
ce que vous voulez (bien que je ne l'ai pas testé) est
B.copyTo(A(cv::Rect_<int>(0,0,2,2)))
Vous pouvez le faire en une seule ligne:
B = A(cv::Rect(0,0,2,2)).clone();
N'ayez pas peur de travailler avec des pointeurs
const unsigned int row_size = col_size = 3;
Mat A = Mat::one( row_size, col_size, CV_32F );
Mat B = Mat::zeros( row_size, col_size, CV_32F );
for(int i = 0; i < row_size; i++)
{
float* Aitt = A.ptr<float>(i);
float* Bitt = B.ptr<float>(i);
for(int j = 0; j < ( col_size - i ); ++j)
Aitt[j] = Bitt[j];
}
Qu'est-ce qui ne va pas avec la première approche?
Pour beaucoup de Matlab temps