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?

21
demandé sur Jav_Rock 2010-10-27 12:30:44

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);
35
répondu Christian 2010-11-10 12:51:58

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)))
12
répondu Tim MB 2014-01-10 15:43:18

Vous pouvez le faire en une seule ligne:

B = A(cv::Rect(0,0,2,2)).clone();
4
répondu user11094 2013-04-04 19:46:18

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

2
répondu Guillaume Massé 2010-10-29 14:25:16