c++ - type - opencv mat to image
¿Cómo obtengo el tamaño de un cv:: Mat multidimensional?(Mat, o MatND) (3)
Acaba de encontrar uno de los muchos defectos de la API de OpenCV C ++.
Si analiza el código fuente de OpenCV, versión 2.4.6.1, se dará cuenta de que cv::Mat::size
es un objeto miembro de tipo cv::Mat::MSize
, que se define como
struct CV_EXPORTS MSize
{
MSize(int* _p);
Size operator()() const;
const int& operator[](int i) const;
int& operator[](int i);
operator const int*() const;
bool operator == (const MSize& sz) const;
bool operator != (const MSize& sz) const;
int* p;
};
Por lo tanto, cv::Mat::size()
realidad se refiere a cv::Mat::MSize::operator ()()
, cuyo tipo de devolución se define como
typedef Size_<int> Size2i;
typedef Size2i Size;
Citando el manual de OpenCV , el Size
es un
"Clase de plantilla para especificar el tamaño de una imagen o un rectángulo. La clase incluye dos miembros llamados ancho y alto".
En otras palabras, el Size
solo es adecuado para matrices 2D.
Afortunadamente, no se pierde toda esperanza, ya que puede usar cv::Mat::MSize::operator [](int i)
para obtener el tamaño de la matriz a lo largo de su i-ésima dimensión .
const int sz[] = {10,10,9};
cv::Mat temp(3,sz,CV_64F);
std::cout << "temp.dims = " << temp.dims << "temp.size = [";
for(int i = 0; i < temp.dims; ++i) {
if(i) std::cout << " X ";
std::cout << temp.size[i];
}
std::cout << "] temp.channels = " << temp.channels() << std::endl;
temp.dims = 3 temp.size = [10 x 10 x 9] temp.channels = 1
Estoy creando un objeto MAT multidimensional y me gustaría obtener el tamaño del objeto, por ejemplo,
const int sz[] = {10,10,9};
Mat temp(3,sz,CV_64F);
std::cout << "temp.dims = " << temp.dims << " temp.size = " << temp.size() << " temp.channels = " << temp.channels() << std::endl;
Creo que el MAT resultante es 10x10x9, y me gustaría confirmarlo, pero la declaración COUT da:
temp.dims = 3 temp.size = [10 x 10] temp.channels = 1
Esperaba ver a cualquiera de los dos
temp.dims = 3 temp.size = [10 x 10 x 9] temp.channels = 1
O:
temp.dims = 3 temp.size = [10 x 10] temp.channels = 9
¿Cómo puedo obtener la dimensionalidad de este objeto Mat? No vi ningún método en Mat :: Mat o MatND
OpenCV 2.4.9 se ocupa de tamaños multidimensionales muy bien. La struct
cv::Mat::MSize
puede almacenar y devolver múltiples dimensiones. El miembro de datos cv::Mat::size
es del tipo cv::Mat::MSize
. Este código enumerará las dimensiones para usted:
const int sz[] = {3, 4, 3, 6};
cv::Mat bigm(4, sz, CV_8UC1);
cout << bigm.dims << ''/t'';
for (int i=0; i<bigm.dims; ++i)
cout << bigm.size[i] << '','';
cout << endl;
La salida es:
4 3,4,3,6,
std::vector<size_t> getMatDims(const cv::Mat& m)
{
std::vector<size_t> dims(m.dims);
std::partial_sum(&m.step[0],&m.step[0]+m.dims,dims.begin(),[](size_t a,size_t b){ return a/b; });
return dims;
}