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 entradain
em 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 é 8bppSe 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;