如何获取 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_64FC1
的 Mat
,因此您需要像这样访问它:
kernel.at<double>(i,j);
为清楚起见,我通常使用Mat_<T>
:
Mat1d kernel = getGaussianKernel(...);
并像这样访问它:
kernel(i,j);
我目前正在尝试使用 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_64FC1
的 Mat
,因此您需要像这样访问它:
kernel.at<double>(i,j);
为清楚起见,我通常使用Mat_<T>
:
Mat1d kernel = getGaussianKernel(...);
并像这样访问它:
kernel(i,j);