ho una risposta più lungo senza fiato per chiunque voglia creare una matrice di oggetti personalizzati, di qualsiasi dimensione.
È necessario specializzare il modello DataType, ma invece di disporre di 1 canale, si rendono i canali della stessa dimensione dell'oggetto personalizzato. Potrebbe anche essere necessario sostituire alcune funzioni per ottenere le funzionalità previste, ma torneremo in seguito.
In primo luogo, ecco un esempio di mia abitudine tipo di modello di specializzazione: la funzionalità
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),
};
};
}
Seconda .. si consiglia di ignorare alcune funzioni per ottenere attesi:
// 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);
};
Il typedef di super non è richiesto ma aiuta con la leggibilità nel cpp. Avviso Ho ignorato il costruttore con i parametri larghezza/altezza.Questo perché dobbiamo istanziare il tappetino in questo modo se vogliamo una matrice 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);
}
Il < a _T>() per la modifica è solo per il codice più pulito:
const Sample & SampleMat::at(int x, int y)
{
if (y == 0)
return super::at<Sample>(x);
return super::at<Sample>(cv::Point(x, y));
}
potete inserire la vostra definizione di 'KalmanRGBPixel' struct/classe? –
Perché vuoi usare un cv :: Mat per questo quando non userai nessuna delle funzionalità cv :: Mat? Potresti semplicemente utilizzare un array bidimensionale, ecc. – Sean
@Sean: la funzionalità 'cv :: Mat' include operatori integrati per l'accesso agli elementi, oltre a una corretta pulizia. –