В настоящее время я пытаюсь реализовать пользовательский размер M * N Gaussian Blur на изображении с использованием 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]
}
@Miki о! не знал, что он возвращает двойной мат, большое спасибо, я застрял на несколько дней
По умолчанию cv::getGaussianKernel
возвращает Mat
типа CV_64FC1
, поэтому вам нужно получить к нему доступ следующим образом:
kernel.at<double>(i,j);
Для ясности я обычно использую Mat_<T>
:
Mat1d kernel = getGaussianKernel(...);
И получить к нему доступ, как:
kernel(i,j);
kernel.ptr<двойной>(i)