tengo una respuesta más largo aliento para aquellos que se quieran crea una matriz de objetos personalizados, de cualquier tamaño.
Deberá especializar la plantilla de tipo de datos, pero en lugar de tener 1 canal, los hará del mismo tamaño que su objeto personalizado. También es posible que deba sobrescribir algunas funciones para obtener la funcionalidad esperada, pero volvamos a eso más adelante.
primer lugar, aquí es un ejemplo de mi costumbre plantilla del tipo de especialización: funcionalidad
typedef HOGFilter::Sample Sample;
namespace cv {
template<> class DataType<Sample>
{
public:
typedef HOGFilter::Sample value_type;
typedef HOGFilter::Sample channel_type;
typedef HOGFilter::Sample work_type;
typedef HOGFilter::Sample vec_type;
enum {
depth = CV_8U,
channels = sizeof(HOGFilter::Sample),
type = CV_MAKETYPE(depth, channels),
};
};
}
En segundo lugar .. es posible que desee para anular algunas funciones para obtener espera:
// Special version of Mat, a matrix of Samples. Using the power of opencvs
// matrix manipulation and multi-threading capabilities
class SampleMat : public cv::Mat_<Sample>
{
typedef cv::Mat_<Sample> super;
public:
SampleMat(int width = 0, int height = 0);
SampleMat &operator=(const SampleMat &mat);
const Sample& at(int x, int y = 0);
};
El typedef de súper no es necesario, pero ayuda con la legibilidad en el cpp. Observe que he anulado el constructor con parámetros de ancho/alto.Esto se debe a que tenemos que instanciar el tapete de esta manera si queremos una matriz 2D.
SampleMat::SampleMat(int width, int height)
{
int count = width * height;
for (int i = 0; i < count; ++i)
{
HOGFilter::Sample sample;
this->push_back(sample);
}
*dynamic_cast<Mat_*>(this) = super::reshape(channels(), height);
}
El al < _T>() de la redefinición es sólo para un código más limpio:
const Sample & SampleMat::at(int x, int y)
{
if (y == 0)
return super::at<Sample>(x);
return super::at<Sample>(cv::Point(x, y));
}
Se puede publicar definición de su estructura 'KalmanRGBPixel'/clase? –
¿Por qué quiere usar un cv :: Mat para esto cuando no va a utilizar ninguna de las funciones de cv :: Mat? Solo podría usar una matriz bidimensional, etc. – Sean
@Sean: la funcionalidad 'cv :: Mat' incluye operadores incorporados para acceder a los elementos, así como una limpieza adecuada. –