Comment nommer mes canaux RVB en utilisant cv :: Mat_

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:

  • Si le type d’image est float à 3 canaux ( CV_32FC3 ), remplacez cv::Vec3b par cv::Vec3f
  • Si le type d’image est double sur 3 canaux ( CV_64FC3 ), remplacez cv::Vec3b par cv::Vec3d
  • Si le type d’image est 3 canaux int ( CV_32SC3 ), remplacez cv::Vec3b par cv::Vec3i
  • Si le type d’image est 3 canaux court int ( 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 et obtenu une valeur négative G: 29096 B: -21671 R: 23413 renvoyé.

Si CV_16UC3, adressez Mat avec . En utilisant ceci, j’ai eu G: 29096 B: 43865 R: 23413

le “s” dans CV_16SC3 signifie “signé et non court”.