Как получить фактическое значение ядра для Mat, возвращаемого из OpenCV getGaussianKernel?

#c #opencv #gaussian #mat

#c #opencv #гауссовский #mat

Вопрос:

В настоящее время я пытаюсь реализовать размытие по Гауссу пользовательского размера M * N на изображении с использованием CUDA.

Я намерен использовать OpenCV getGuassianKernel, чтобы получить ядро M * 1 и выполнить операцию размытия CUDA по вертикали по Гауссу, затем получить другое ядро 1 * N и выполнить другую операцию размытия CUDA по горизонтали по Гауссу.

Как я могу получить фактическое значение с плавающей точкой в ядре? Я только что попробовал следующий способ, и поведение кажется странным:

 Mat kernel= getGaussianKernel(3, -1);

cout << kernel<< endl;   //yields[0.25,5,0.25]

vector<float> kernel_vector;
for (int i = 0; i < kernel.rows;   i) {
    kernel_vector.insert(kernel_vector.end(), kernel.ptr<float>(i), kernel.ptr<float>(i) kernel.cols);
}
for(auto i : kernel_vector){
    cout << i << endl;   //yields[0,0,0]
}
 

Комментарии:

1. kernel.ptr<double>(i)

2. @Miki о! не знал, что он возвращает двойной мат, большое спасибо, я застрял на несколько дней

Ответ №1:

По умолчанию cv::getGaussianKernel возвращает Mat тип CV_64FC1 , поэтому вам нужно получить к нему доступ следующим образом:

 kernel.at<double>(i,j);
 

Для наглядности я обычно использую Mat_<T> :

 Mat1d kernel = getGaussianKernel(...);
 

И получить к нему доступ следующим образом:

 kernel(i,j);