Qt 3D的研究(八):边缘检测

原创 2015年03月11日 09:33:02

Qt 3D的研究(八):边缘检测

       上一篇文章讲到了如何使用渲染至纹理技术将我们第一遍渲染保存至纹理以便做一些操作。还是上一次的例子,我简要地分析一下如何进行边缘检测。

蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/44194475。欢迎同行前来探讨。

       还是上次的图片:

       我们这里做了两遍渲染。第一遍渲染使用卡通渲染的方法执行,如下:

       有关第一遍卡通渲染的着色器代码,可以参考我以前写的一篇文章。接下来,我们通过渲染至纹理技术,将帧缓存中的colorattachment以及depth attachment分别输出至两个不同的纹理中。这里需要注意,即使我们选定的窗口不是2n的大小,我们选择作为renderattachment的纹理必须是2n的大小。输出至纹理很重要,因为在第二遍渲染(2ndrender pass)中,我们需要将纹理作为采样器传递给GLSL,并且在片断着色器中进行采样。下面是第二遍渲染的GLSL代码:

// Ouput.vert
#version 100

// Qt 3D默认提供的参数
attribute vec4 vertexPosition;
uniform mat4 modelMatrix;

// 自己提供的参数

void main( void )
{
    gl_Position = modelMatrix * vertexPosition;
}

// Output.frag
#version 100

// 自己提供的参数
uniform sampler2D colorAttachTex;
uniform vec2 texSize;
uniform float texOffsetX;
uniform float texOffsetY;

float gray( vec4 color )
{
    return dot( color.xyz, vec3( 0.299, 0.587, 0.114 ) );
}

void main( void )
{
    vec4 texColor[9];
    texColor[0] = texture2D( colorAttachTex, gl_FragCoord.xy / texSize + vec2( -texOffsetX, texOffsetY ) );
    texColor[1] = texture2D( colorAttachTex, gl_FragCoord.xy / texSize + vec2( 0.0, -texOffsetY ) );
    texColor[2] = texture2D( colorAttachTex, gl_FragCoord.xy / texSize + vec2( texOffsetX, texOffsetY ) );
    texColor[3] = texture2D( colorAttachTex, gl_FragCoord.xy / texSize + vec2( -texOffsetX, 0 ) );
    texColor[4] = texture2D( colorAttachTex, gl_FragCoord.xy / texSize + vec2( 0.0, 0.0 ) );
    texColor[5] = texture2D( colorAttachTex, gl_FragCoord.xy / texSize + vec2( texOffsetX, 0 ) );
    texColor[6] = texture2D( colorAttachTex, gl_FragCoord.xy / texSize + vec2( -texOffsetX, -texOffsetY ) );
    texColor[7] = texture2D( colorAttachTex, gl_FragCoord.xy / texSize + vec2( 0.0, -texOffsetY ) );
    texColor[8] = texture2D( colorAttachTex, gl_FragCoord.xy / texSize + vec2( texOffsetX, -texOffsetY ) );

    // 索贝尔算子
    float sobel_x[9];
    sobel_x[0] = -1.0;
    sobel_x[1] = 0.0;
    sobel_x[2] = 1.0;
    sobel_x[3] = -2.0;
    sobel_x[4] = 0.0;
    sobel_x[5] = 2.0;
    sobel_x[6] = -1.0;
    sobel_x[7] = 0.0;
    sobel_x[8] = 1.0;

    float sobel_y[9];
    sobel_y[0] = 1.0;
    sobel_y[1] = 2.0;
    sobel_y[2] = 1.0;
    sobel_y[3] = 0.0;
    sobel_y[4] = 0.0;
    sobel_y[5] = 0.0;
    sobel_y[6] = -1.0;
    sobel_y[7] = -2.0;
    sobel_y[8] = -1.0;

    // 卷积操作
    vec4 edgeX = vec4( 0.0 );
    vec4 edgeY = vec4( 0.0 );
    for ( int i = 0; i < 9; ++i )
    {
        edgeX += texColor[i] * sobel_x[i];
        edgeY += texColor[i] * sobel_y[i];
    }

    vec4 edgeColor = sqrt( ( edgeX * edgeX ) + ( edgeY * edgeY ) );
    float edgeIntensity = gray( edgeColor );
    const float threshold = 0.5;
    if ( edgeIntensity > threshold )
        gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );
    else discard;
}

colorAttachTex作为纹理的采样器,在此基础上,我们对纹理的每一个像素周围的9个像素点进行采样。这里我们采取了索贝尔(sobel)算子作为卷积核,除了索贝尔算子,还有拉普拉斯(laplace)算子以及普瑞维特(prewitt)算子进行选择。通过9个采样点和索贝尔算子进行卷积操作,就可以得到边缘。卷积操作的公式如下:

       第二遍渲染仅保存了边缘,再加上用普通前向渲染渲染出来的图像,就可以得到带边缘的最终图像了。目前图像的显示还不完美,还出现了一些噪点,这可能需要修改阈值(threshold)进行调整来达到效果。

Qt 3D的研究(九):尝试另外一种边缘检测方法

三维应用程序,通过FBO,将3D图像渲染成纹理,然后对渲染成的纹理进行图像处理,最终显示在屏幕上的,是风格化后的图案。上一次我使用了一种普通的图像处理方法:索贝尔边缘检测法,与我们的卡通渲染结合起来,...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2015年03月18日 10:37
  • 2047

基于亚像素的边缘检测方法

1 引言         数字图像的边缘检测是图像分割、目标识别、区域形状提取等图像处理领域的重要基础。在进行图像理解和分析时,第一步往往是边缘检测。目前边缘检测已经成为机器视觉领域最活跃的课题之一...
  • qq_20823641
  • qq_20823641
  • 2017年03月20日 13:45
  • 2325

Qt 3D的研究(九):尝试另外一种边缘检测方法

三维应用程序,通过FBO,将3D图像渲染成纹理,然后对渲染成的纹理进行图像处理,最终显示在屏幕上的,是风格化后的图案。上一次我使用了一种普通的图像处理方法:索贝尔边缘检测法,与我们的卡通渲染结合起来,...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2015年03月18日 10:37
  • 2047

图像边缘检测在DM642上的应用研究

  • 2013年04月02日 12:34
  • 805KB
  • 下载

图像边缘检测和图像匹配研究及应用

  • 2011年05月10日 09:46
  • 5.31MB
  • 下载

图像边缘检测研究进展

  • 2015年03月01日 18:52
  • 610KB
  • 下载

二型模糊彩色图像的边缘检测方法研究(Retinex)

  • 2010年09月21日 21:50
  • 3.59MB
  • 下载

基于最小二乘支持向量机的图像边缘检测研究

  • 2017年03月05日 16:27
  • 674KB
  • 下载

基于Sobel算子的图像边缘检测研究

  • 2015年04月20日 09:45
  • 331KB
  • 下载

边缘检测技术的发展研究

  • 2008年05月23日 08:59
  • 115KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt 3D的研究(八):边缘检测
举报原因:
原因补充:

(最多只允许输入30个字)