【发布时间】:2014-04-08 18:21:26
【问题描述】:
我有每个像素的 Sobel 算子的梯度。在我的情况下是 320x480。但是我怎样才能将它们与方向联系起来呢?例如,我打算为指纹绘制一个方向图。那么,我该如何开始呢?
是通过将梯度分成块(例如 16x24)然后将梯度相加并用 384 来获得平均梯度吗?然后从那里使用平均梯度从块的中心画一条线?
如果我错了,请纠正我。谢谢。
这是我用来寻找渐变的代码
cv::Mat original_Mat=cv::imread("original.bmp", 1);
cv::Mat grad = cv::Mat::zeros(original_Mat.size(), CV_64F);
cv::Mat grad_x = cv::Mat::zeros(original_Mat.size(), CV_64F);
cv::Mat grad_y = cv::Mat::zeros(original_Mat.size(), CV_64F);
/// Gradient X
cv::Sobel(original_Mat, grad_x, CV_16S, 1, 0, 3);
/// Gradient Y
cv::Sobel(original_Mat, grad_y, CV_16S, 0, 1, 3);
short* pixelX = grad_x.ptr<short>(0);
short* pixelY = grad_y.ptr<short>(0);
int count = 0;
int min = 999999;
int max = -1;
int a=0,b=0;
for(int i = 0; i < grad_x.rows * grad_x.cols; i++)
{
double directionRAD = atan2(pixelY[i], pixelX[i]);
int directionDEG = (int)(180 + directionRAD / CV_PI * 180);
//printf("%d ",directionDEG);
if(directionDEG < min){min = directionDEG;}
if(directionDEG > max){max = directionDEG;}
if(directionDEG < 0 || directionDEG > 360)
{
cout<<"Weird gradient direction given in method: getGradients.";
}
}
【问题讨论】:
标签: c++ opencv orientation gradient fingerprint