Determinando o tipo de modelo ao acessar elementos OpenCV Mat

Estou usando o código a seguir para adicionar algum ruído a uma imagem (direto da referência do OpenCV, página 449 - explicação decv::Mat::begin):

void
simulate_noise(Mat const &in, double stddev, Mat &out)
{
    cv::Size s = in.size();
    vector<double> noise = generate_noise(s.width*s.height, stddev);

    typedef cv::Vec<unsigned char, 3> V4;
    cv::MatConstIterator_<V4> in_itr = in.begin<V4>();
    cv::MatConstIterator_<V4> in_end = in.end<V4>();
    cv::MatIterator_<V4> out_itr = out.begin<V4>();
    cv::MatIterator_<V4> out_end = out.end<V4>();

    for (; in_itr != in_end && out_itr != out_end; ++in_itr, ++out_itr)
    {
        int noise_index = my_rand(noise.size());
        for (int j = 0; j < 3; ++j)
            (*out_itr)[j] = (*in_itr)[j] + noise[noise_index];
    }
}

Nada muito complicado:

in eout são alocadoscv::Mat objetos das mesmas dimensões e tipoitere sobre a imagem de entradainem cada posição, escolha um valor aleatório emnoise (my_rand(int n) retorna um número aleatório em[0..n-1]somar o pixel dein com o valor do ruído aleatóriocolocar o resultado da soma emout

Não gosto desse código porque a seguinte declaração parece inevitável:

typedef cv::Vec<unsigned char, 3> V4;

Ele codificou duas coisas:

As imagens têm 3 canaisA profundidade do canal é 8bpp

Se eu conseguir issotypedef errado (por exemplo, profundidade do canal incorreta ou número incorreto de canais), então meu programa é segmentado por falhas. Eu originalmente useitypedef cv::Vec<unsigned char, 4> V4 para lidar com imagens com um número arbitrário de canais (o máximo de suporte ao OpenCV é 4), mas isso causou um segfault.

Existe alguma maneira de evitar codificar as duas coisas acima? Idealmente, quero algo genérico como:

typedef cv::Vec<in.type(), in.size()> V4;

questionAnswers(3)

yourAnswerToTheQuestion