C++ 意外的哈里斯探测器结果
我将垂直梯度和水平梯度加载到这里发布的函数中,它计算出构成转角响应的总和。为什么只找到边界像素,我的阈值是0,否则图像上有0个角。对于渐变,我使用了sobel操作符 请看下面的输出图像C++ 意外的哈里斯探测器结果,c++,opencv,C++,Opencv,我将垂直梯度和水平梯度加载到这里发布的函数中,它计算出构成转角响应的总和。为什么只找到边界像素,我的阈值是0,否则图像上有0个角。对于渐变,我使用了sobel操作符 请看下面的输出图像 for(int i=0;i
for(int i=0;iimage1.rows-1)|(j-search_size/2<0|j+search_size/2>image1.cols-1)){
继续;
}
双Ix2=0,Iy2=0,Ixy=0;
双detM=0;
双traceM=0;
双R=0;
对于(int m=i-search\u size/2;m//除非你能详细说明一下,否则你是在用浮点运算。浮点并不精确,这可能是图像中出现轻微错误的原因之一?我当然不会依靠浮点运算来生成完美的图像,除非有代码明确地进行错误更正(我不知道您的代码是否考虑到了这一点)。我尝试了其他类型,我尝试了R=det(M)-k*trace(M)还有,没有大的变化。我不确定我是否正确地计算了梯度的总和,以使其更精确,谢谢你的支持。如果你确实将计算更改为数学上等效的计算,并且图像中有轻微的变化,那么它确实看起来像一个浮点错误问题。如果是这样的话,你可能不得不想出一个方法来解决这个问题HAT考虑错误并改正它(或者以某种方式使用整数而不是浮点)。不知道它是多么容易或困难。谢谢,我开始在整个图像中寻找角落,当我把它放在uChar上时,我没有考虑。谢谢朋友。
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
if ((i - search_size / 2 < 0 || i + search_size / 2 > image1.rows - 1) || (j - search_size / 2 < 0 || j + search_size / 2 > image1.cols - 1)) {
continue;
}
double Ix2 = 0, Iy2 = 0, Ixy = 0;
double detM=0;
double traceM=0;
double R = 0;
for (int m = i-search_size /2; m < i + search_size /2 ; m++){
for (int n = j-search_size /2; n < j + search_size/2 ; n++){
gauss = exp(-(((i - m) * (i - m)) + ((j - n) * (j - n))) / gaus_del);
//Compute Ix^2 , Iy^2 and Ixy
Ix2 += gauss*(image1.at<float>(m, n)*image1.at<float>(m, n));
Iy2 += gauss*(image2.at<float>(m, n)*image2.at<float>(m, n));
Ixy += gauss*(image1.at<float>(m, n)*image2.at<float>(m, n));
}
}
detM = (Ix2*Iy2 - Ixy*Ixy);
traceM = Ix2*Ix2 + Iy2*Iy2;
R = detM / traceM;
//cout <<i+j<< endl;
// std::cout << "R :" << Iy2 << endl;
if (R > threshold)
{
circle(image, cv::Point2f(i, j), 3.5, cv::Scalar(255, 255, 0), 1, 5);
cout << "corner found" << endl;
}
}
}