#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);