Как получить фактическое значение ядра Mat, возвращенное из OpenCV getGaussianKernel? - PullRequest
0 голосов
/ 17 апреля 2019

В настоящее время я пытаюсь реализовать нестандартный размер 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]
}

1 Ответ

1 голос
/ 18 апреля 2019

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

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

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

Mat1d kernel = getGaussianKernel(...);

И получить к нему доступ, как:

kernel(i,j);
...