2013-07-18 3 views
1

J'essaie de charger une image à partir d'un fichier en tant que CvMat (comme mat1) et en essayant de créer une autre matrice (mat2) de même taille que le fichier en cours de lecture et d'essayer soustraire la valeur moyenne de la matrice originale (mat1) et essayer d'insérer la valeur dans la nouvelle matrice (mat2) mais malheureusement, je reçois une erreur. Quelqu'un peut-il me dire pourquoi? J'utilise C API dans OpenCV. Ce qui suit est le codecopier une taille de matrice d'image à une autre matrice dans OpenCV

CvMat* mat1 = cvLoadImageM(argv[2], CV_LOAD_IMAGE_UNCHANGED); // load an image from a file as a CvMat 

    CvMat* mat2 = cvCreateMat(mat1->width, mat1->height, CV_32FC1); // trying to create a matrix as same width and height as the image file being loaded. 

    CvScalar avg = cvAvg(mat1); // calculating the avg of all elements of matrix 

    cvSubS(mat1, avg, mat2); // subtracting the average value from the original matrix and inserting the new values to matrix mat2 

L'erreur est

OpenCV Error: Assertion failed (src1.size == dst.size && src1.channels() == dst.channels()) in cvAddS, file /home/Documents/opencv-2.4.5/modules/core/src/arithm.cpp, line 2783 terminate called after throwing an instance of 'cv::Exception' what(): /homeDocuments/opencv-2.4.5/modules/core/src/arithm.cpp:2783: error: (-215) src1.size == dst.size && src1.channels() == dst.channels() in function cvAddS 
+0

Est-ce que votre mat1.type CV_32FC1? – William

+0

@ William Je ne sais pas. J'essaie juste de le charger à partir d'un fichier image. Savez-vous comment puis-je vérifier son type? Les valeurs de mat1 sont 0 et -2 – user227666

+3

Pouvez-vous essayer 'mat1-> type()' au lieu de 'CV_32FC1'? – JonesV

Répondre

4

Si vous ne connaissez pas le type de mat1, vous pouvez utiliser mat1->type pour l'obtenir.

Essayez d'utiliser les éléments suivants:

CvMat* mat2 = cvCreateMat(mat1->width, mat1->height, mat1->type); // trying to create a matrix as same width and height as the image file being loaded. 
+0

votre première suggestion fonctionne mais pas votre deuxième, il montre une erreur – user227666

2

cvCreateMat (lignes, Col.)

En tant que tel-vous pas besoin

CvMat* mat2 = cvCreateMat(mat1->height, mat1->width, CV_32FC1); 

Swap les accessoiriste de largeur et de hauteur autour.

L'erreur est due au fait que vous avez la mauvaise dimension de hauteur de largeur ou le mauvais nombre de canaux dans votre image cible (mat2). Je suppose que CvScalar renvoie une image à 1 canal. donc c'est probablement les dimensions.

Questions connexes