Je souhaite accéder à mes éléments masortingciels de la manière suivante:
frame[i][j].Red
c’est-à-dire le canal rouge du (i, j) -the pixe.
J’ai essayé:
typedef struct{unsigned char Blue,Green,Red;}Pixel; typedef cv::Mat_ Image;
Cependant, lorsque j’essaie d’imread (), imwrite () ou quoi que ce soit avec le type ainsi défini, g ++ m’accueille avec:
OpenCV Error: Assertion failed (func != 0) in convertTo, file /home/users/mvitkov/projects/opencv-legacy/OpenCV-2.3.1/modules/core/src/convert.cpp, line 937 terminate called after throwing an instance of 'cv::Exception' what(): /home/users/mvitkov/projects/opencv-legacy/OpenCV-2.3.1/modules/core/src/convert.cpp:937: error: (-215) func != 0 in function convertTo
Mise à jour: Donc, pas de réponse à ma question probablement mal posée. Dommage. L’essence de la question est de savoir comment adresser les canaux individuels avec des noms sensibles (rouge, vert, bkue), et non la notation d’indexation de tableau c-era [2]
. Duh!
Voici comment accéder à chaque canal:
blue = frame.at(i,j)[0]; green = frame.at (i,j)[1]; red = frame.at (i,j)[2];
Le code ci-dessus suppose que vous avez une image à 3 canaux où chaque valeur est un caractère non signé de 8 bits ( CV_8UC3
) . Ce type est utilisé dans de nombreux formats d’image courants. Cependant, si vous avez un type d’image 3 canaux différent, procédez comme suit:
CV_32FC3
), remplacez cv::Vec3b
par cv::Vec3f
CV_64FC3
), remplacez cv::Vec3b
par cv::Vec3d
CV_32SC3
), remplacez cv::Vec3b
par cv::Vec3i
CV_16SC3
) ou CV_16SC3
16 bits ( CV_16UC3
), remplacez cv::Vec3b
par cv::Vec3s
Vous ne savez pas quel format d’image vous utilisez? Essayez d’appeler getImgType(frame)
(voir le code ci-dessous).
ssortingng getImgType(cv::Mat frame) { int imgTypeInt = frame.type(); int numImgTypes = 28; // 7 base types, with 4 channel options each (C1, ..., C4) int enum_ints[] = {CV_8UC1, CV_8UC2, CV_8UC3, CV_8UC4, CV_8SC1, CV_8SC2, CV_8SC3, CV_8SC4, CV_16UC1, CV_16UC2, CV_16UC3, CV_16UC4, CV_16SC1, CV_16SC2, CV_16SC3, CV_16SC4, CV_32SC1, CV_32SC2, CV_32SC3, CV_32SC4, CV_32FC1, CV_32FC2, CV_32FC3, CV_32FC4, CV_64FC1, CV_64FC2, CV_64FC3, CV_64FC4}; ssortingng enum_ssortingngs[] = {"CV_8U", "CV_8UC1", "CV_8UC2", "CV_8UC3", "CV_8UC4", "CV_8SC1", "CV_8SC2", "CV_8SC3", "CV_8SC4", "CV_16UC1", "CV_16UC2", "CV_16UC3", "CV_16UC4", "CV_16SC1", "CV_16SC2", "CV_16SC3", "CV_16SC4", "CV_32SC1", "CV_32SC2", "CV_32SC3", "CV_32SC4", "CV_32FC1", "CV_32FC2", "CV_32FC3", "CV_32FC4", "CV_64FC1", "CV_64FC2", "CV_64FC3", "CV_64FC4"}; for(int i=0; i
Si le type d’image est 3 canaux court int (CV_16SC3) ou uchar 16 bits (CV_16UC3), remplacez cv :: Vec3b par cv :: Vec3s
ce n’est tout simplement pas correct. J’ai adressé une fois une image non signée 3 bits 16 bits sur 3 canaux avec
Si CV_16UC3, adressez Mat avec
le “s” dans CV_16SC3 signifie “signé et non court”.