Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Computer vision Harris角点检测器将对角边检测为角点_Computer Vision_Glsl_Corner Detection - Fatal编程技术网

Computer vision Harris角点检测器将对角边检测为角点

Computer vision Harris角点检测器将对角边检测为角点,computer-vision,glsl,corner-detection,Computer Vision,Glsl,Corner Detection,我正在尝试在WebGL/GLSL中实现一个Harris角点检测器(更大的CV算法的第一部分)。就我所见,我的高斯和索贝尔算子按预期工作(即,它是模糊的,索贝尔给了我图像强度的导数) 我遇到的问题是,哈里斯角点检测器的响应对于对角线边缘来说太高了——根据检测器,任何对角线边缘都是所有的角点。当然,这是不正确的,但我不知道为什么。无论我如何调整响应公式,它似乎都有这个问题 以下是我的着色器代码: precision mediump float; // the texture I am trying

我正在尝试在WebGL/GLSL中实现一个Harris角点检测器(更大的CV算法的第一部分)。就我所见,我的高斯和索贝尔算子按预期工作(即,它是模糊的,索贝尔给了我图像强度的导数)

我遇到的问题是,哈里斯角点检测器的响应对于对角线边缘来说太高了——根据检测器,任何对角线边缘都是所有的角点。当然,这是不正确的,但我不知道为什么。无论我如何调整响应公式,它似乎都有这个问题

以下是我的着色器代码:

precision mediump float;

// the texture I am trying to detect the corners in
// (fed from a live video source)
uniform sampler2D sampler2d;

// the Gaussian / Sobel kernels are precalculated and passed as textures
uniform sampler2D gaussian_x;
uniform sampler2D gaussian_y;

// stdev for the Gaussian
#define sigma (3.0)
#define sigma_ceil (3.0)

// pixel_w and pixel_h represent the size of pixels in tex coords
#define pixel_w (1.0 / 960.0)
#define pixel_h (1.0 / 540.0)

const float offset_start = -(sigma_ceil * 3.0);
const float offset_end   = ((sigma_ceil * 3.0) + .5);
const float pixel_gauss  = 1.0 / (sigma_ceil * 2.0 + 1.0);

varying vec4 fPosition;
varying vec2 fTexCoord;

void main(){
  vec2 texCoord = vec2(fTexCoord.s, fTexCoord.t);

  vec3 total_x = vec3(0, 0, 0);
  vec3 total_y = vec3(0, 0, 0);

  for (float x = offset_start; x < offset_end; x += 1.0){
    for (float y = offset_start; y < offset_end; y += 1.0){
      total_x += texture2D(sampler2d, vec2(texCoord.s + x * pixel_w, texCoord.y + y * pixel_h)).rgb
        * ((texture2D(gaussian_x, vec2((x - offset_start) * pixel_gauss, (y - offset_start) * pixel_gauss)).rgb
           - vec3(0.5)) * .1)
        * 255.0
        ;
      total_y += texture2D(sampler2d, vec2(texCoord.s + x * pixel_w, texCoord.y + y * pixel_h)).rgb
        * ((texture2D(gaussian_y, vec2((x - offset_start) * pixel_gauss, (y - offset_start) * pixel_gauss)).rgb
           - vec3(0.5)) * .1)
        * 255.0
        ;
    }
  }

  float total_xf = (total_x.r + total_x.g + total_x.b) / 3.0;
  float total_yf = (total_y.r + total_y.g + total_y.b) / 3.0;

  float a = (total_xf * total_xf); // Ix2
  float b = (total_yf * total_yf); // Iy2
  float c = (total_xf * total_yf); // Ixy
  float det = (a * b) - c;
  float trc = a + b;

  float res = det - 0.04 * (trc * trc);

  res += .5; // to see when it goes negative

  gl_FragColor = vec4(res, res, res, 1);
}
precision mediump float;
//我试图检测其中的角的纹理
//(由现场视频源提供)
均匀取样器2D取样器2D;
//高斯/索贝尔核是预先计算的,并作为纹理传递
均匀采样二维高斯分布;
均匀采样二维高斯分布;
//高斯分布的stdev
#定义西格玛(3.0)
#定义西格玛单元(3.0)
//像素w和像素h表示像素的大小,单位为tex坐标
#定义像素w(1.0/960.0)
#定义像素(1.0/540.0)
常量浮点偏移量\u开始=-(西格玛单元*3.0);
常量浮点偏移量_end=((sigma_ceil*3.0)+.5);
常量浮点像素高斯=1.0/(西格玛像素*2.0+1.0);
可变矢量位置;
可变vec2 fTexCoord;
void main(){
vec2 texCoord=vec2(fTexCoord.s,fTexCoord.t);
vec3-total_x=vec3(0,0,0);
vec3-total_y=vec3(0,0,0);
用于(浮动x=偏移量_开始;x<偏移量_结束;x+=1.0){
对于(浮动y=偏移量_开始;y<偏移量_结束;y+=1.0){
total_x+=texture2D(sampler2d,vec2(texCoord.s+x*pixel_w,texCoord.y+y*pixel_h)).rgb
*((纹理2d(高斯x,向量2((x-偏移开始)*像素高斯,(y-偏移开始)*像素高斯)).rgb
-vec3(0.5))*.1)
* 255.0
;
total_y+=texture2D(sampler2d,vec2(texCoord.s+x*pixel_w,texCoord.y+y*pixel_h)).rgb
*((纹理2D(高斯y,矢量2((x-偏移开始)*像素高斯,(y-偏移开始)*像素高斯)).rgb
-vec3(0.5))*.1)
* 255.0
;
}
}
浮动总量xf=(总量x.r+总量x.g+总量x.b)/3.0;
浮动总收益=(总收益率+总收益率+总收益率)/3.0;
浮点a=(总计×总计);//Ix2
浮动b=(总计×总计);//Iy2
浮点c=(总计×总计);//Ixy
浮点数=(a*b)-c;
浮动trc=a+b;
浮动res=det-0.04*(trc*trc);
res+=.5;//查看它何时变为负值
gl_FragColor=vec4(分辨率,分辨率,分辨率,1);
}
在此之后,我将进行非最大值抑制和阈值化,但这一步的结果似乎已经错了。两个高斯采样器从如下纹理中采样:

这些都是预先计算的,这也是我从每个像素中减去0.5的原因(因为灰色像素实际上代表0权重)。.1和255因子使图像对我可见,我尝试了许多不同的值,但我认为它们不是问题所在

我也尝试过使用
res=det/trc
近似值,但结果似乎更糟。问题依然存在。使用标准棋盘格图案,如下图所示:

这就是当我水平向相机显示时的结果:

我不确定水平边会发生什么,但是垂直边是黑色的(正如预期的那样),角点显示非常白色的像素,当设置阈值时会产生预期的结果。但是,当我沿对角线方向旋转图案时:

所有的边缘现在都是白色的。我已经调整了很多不同的值,使用了一个更高的高斯标准差,等等,但似乎没有产生预期的结果。哈里斯检测器只是将对角线边缘检测为角点吗?我对此表示怀疑,因为看到了其他一些实现

你知道问题出在哪里吗


(另外,在你推荐openCV之前……这是在WebGL中运行的,我想/应该自己实现这个算法。)

oth,是不是你到处都在饱和?如果“可视化增益”是,比如说,10而不是255会发生什么?@Francescocalari如果我这样做,输出会更微弱,……所以在乘以它(res变量)来查看它的作用后,我可以看到它对任何对角线边缘都有很高的响应。高于水平测试中拐角的响应。我把它改为10,然后改为1,必须把分辨率乘以10000才能看到任何东西。如果我能发现任何差异,那就是在增益较低的情况下,对角线边缘现在显示为白色和黑色(即正和负),具体取决于方向?最初的边缘都是白色的,但有些边缘有黑色的轮廓。奥托,是不是你到处都在饱和?如果“可视化增益”是,比如说,10而不是255会发生什么?@Francescocalari如果我这样做,输出会更微弱,……所以在乘以它(res变量)来查看它的作用后,我可以看到它对任何对角线边缘都有很高的响应。高于水平测试中拐角的响应。我把它改为10,然后改为1,必须把分辨率乘以10000才能看到任何东西。如果我能发现任何差异,那就是在增益较低的情况下,对角线边缘现在显示为白色和黑色(即正和负),具体取决于方向?最初的边缘都是清晰的白色,但有些边缘轮廓是黑色的。