如何获取 OpenCV getGaussianKernel 返回的 Mat 的实际核值?

How to get the actual kernel value of the Mat returned from OpenCV getGaussianKernel?

我目前正在尝试使用 CUDA 在图像上实现自定义大小 M*N 高斯模糊。

我打算用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]
}

默认情况下,cv::getGaussianKernel returns 类型为 CV_64FC1Mat,因此您需要像这样访问它:

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

为清楚起见,我通常使用Mat_<T>:

Mat1d kernel = getGaussianKernel(...);

并像这样访问它:

kernel(i,j);