Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
Image processing 将修改后的像素存储回纹理内存_Image Processing_Opengl Es_Opengl Es 2.0_Glsl_Fragment Shader - Fatal编程技术网

Image processing 将修改后的像素存储回纹理内存

Image processing 将修改后的像素存储回纹理内存,image-processing,opengl-es,opengl-es-2.0,glsl,fragment-shader,Image Processing,Opengl Es,Opengl Es 2.0,Glsl,Fragment Shader,嗨,我正在尝试使用openGL ES2.0实现一个图像重定位算法。该算法首先使用Sobel滤波器,然后使用图像差分分别检查边缘和运动。然后,它使用这些值创建一个矩阵,该矩阵将确定可以从图像中删除哪些像素。到目前为止,我已经使用片段着色器实现了sobel过滤器和图像差异。一旦我有了边缘贴图和运动贴图,我添加两个值,并将它们规格化为0到1之间。现在我需要在这个标准化矩阵上再次做一个sobel滤波器。但我不知道我是否可以将其存储回纹理内存,以便再次将其作为纹理加载。或者我应该将这些值存储在与图像大小相

嗨,我正在尝试使用openGL ES2.0实现一个图像重定位算法。该算法首先使用Sobel滤波器,然后使用图像差分分别检查边缘和运动。然后,它使用这些值创建一个矩阵,该矩阵将确定可以从图像中删除哪些像素。到目前为止,我已经使用片段着色器实现了sobel过滤器和图像差异。一旦我有了边缘贴图和运动贴图,我添加两个值,并将它们规格化为0到1之间。现在我需要在这个标准化矩阵上再次做一个sobel滤波器。但我不知道我是否可以将其存储回纹理内存,以便再次将其作为纹理加载。或者我应该将这些值存储在与图像大小相同的矩阵中?如何使用GLSL实现这一点?(我是GLSL的初学者。这可能是个愚蠢的问题:p)

以下是frag着色器:

precision mediump float;
varying vec2 coordVar;  
uniform sampler2D s_baseMap;
uniform sampler2D s_lightMap;
void main() 
{
    vec4 baseColor; 
    float basemono;
    vec4 lightColor;
    float lightmono;
    float diffmap;
    baseColor = texture2D( s_baseMap, coordVar );
    lightColor = texture2D( s_lightMap, coordVar );
    //######TEMPORAL SALIENCY MAP#########
    basemono = baseColor .r * 0.299 + baseColor .g * 0.587 + baseColor .b * 0.114;
    lightmono = lightColor.r * 0.299 + lightColor.g * 0.587 + lightColor.b * 0.114;
    diffmap = basemono - lightmono;
    //######## SPATIAL SALIENCY MAP #######
    float pixelHSobel;
    float pixelVSobel;
    float pixel;
    mat3 sobelHoriz = mat3(
         0.125,  0.250, 0.125,
         0.000,  0.000, 0.000,
         -0.125,-0.250,-0.125);
         mat3 sobelVert = mat3(
         -0.125, 0, 0.125,
         -0.250, 0, 0.250,
         -0.125, 0, 0.125);
         float stepH = 1.0/800.0;
         float stepV = 1.0/600.0;
         float tmp1;
         float tmp2;
         float tmp3;
         float tmp4;
         float tmp5;
         float tmp6;
         float tmp7;
         float tmp8;
         float tmp9;
      // ####### Horizontal Sobel ######
         tmp1 = texture2D(s_baseMap, coordVar.st + vec2(-stepH, stepV)).r * sobelHoriz[0][0];
         tmp3 = texture2D(s_baseMap, coordVar.st + vec2(stepH, stepV)).r * sobelHoriz[2][0];
         tmp4 = texture2D(s_baseMap, coordVar.st + vec2(-stepH, 0.0)).r * sobelHoriz[0][1];
         tmp6 = texture2D(s_baseMap, coordVar.st + vec2(stepH,0.0)).r *sobelHoriz[2][1];
         tmp7 = (texture2D(s_baseMap, coordVar.st + vec2(-stepH, -stepV)).r *sobelHoriz[0][2]);
         tmp9 = (texture2D(s_baseMap, coordVar.st + vec2(stepH, -stepV)).r *sobelHoriz[2][2]);
         pixelHSobel = tmp1+tmp3 + tmp4 + tmp6+ tmp7 +  tmp9 + 0.5;
      // ####### Vertical Sobel #######
         tmp1 = texture2D(s_baseMap, coordVar.st + vec2(-stepH, stepV)).r * sobelVert[0][0];
         tmp2 = texture2D(s_baseMap, coordVar.st + vec2(0.0, stepV)).r * sobelVert[1][0];
         tmp3 = texture2D(s_baseMap, coordVar.st + vec2(stepH, stepV)).r * sobelVert[2][0];
         tmp4 = texture2D(s_baseMap, coordVar.st + vec2(-stepH, 0.0)).r * sobelVert[0][1];
        tmp5 = texture2D(s_baseMap, coordVar.st + vec2(0.0, 0.0)).r *sobelVert[1][1];
         tmp6 = texture2D(s_baseMap, coordVar.st + vec2(stepH,0.0)).r *sobelVert[2][1];
         tmp7 = (texture2D(s_baseMap, coordVar.st + vec2(-stepH, -stepV)).r *sobelVert[0][2]);
         tmp8 = (texture2D(s_baseMap, coordVar.st + vec2(0.0, -stepV)).r *sobelVert[1][2]);
         tmp9 = (texture2D(s_baseMap, coordVar.st + vec2(stepH, -stepV)).r *sobelVert[2][2]);
         pixelVSobel = tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6 + tmp7 + tmp8 + tmp9 + 0.5;
         pixel = (sqrt(pixelVSobel*pixelVSobel +pixelHSobel*pixelHSobel));
         if (pixel <= 0.715)
         {
            pixel=0.0;
         }
         else
         {
            pixel=1.0;
         }
         // ###########IMPORTANCE MATRIX########### 
      float impmap = (pixel+diffmap)/2.0;
         // ########## display ######
          gl_FragColor = vec4(impmap,impmap,impmap,1.0);
precision mediump float;
可变vec2坐标值;
统一二维采样器基础图;
均匀采样二维光照图;
void main()
{
vec4基色;
浮动基莫诺;
vec4浅色;
浮光单声道;
浮动扩散图;
baseColor=texture2D(s_baseMap,coordVar);
lightColor=texture2D(s_光照贴图,coordVar);
//######时间显著性图#########
basemono=baseColor.r*0.299+baseColor.g*0.587+baseColor.b*0.114;
lightmono=lightColor.r*0.299+lightColor.g*0.587+lightColor.b*0.114;
diffmap=basemono-lightmono;
//########空间显著图#######
浮动像素框;
浮动像素体;
浮动像素;
mat3 sobelHoriz=mat3(
0.125,  0.250, 0.125,
0.000,  0.000, 0.000,
-0.125,-0.250,-0.125);
mat3 sobelVert=mat3(
-0.125, 0, 0.125,
-0.250, 0, 0.250,
-0.125, 0, 0.125);
浮动stepH=1.0/800.0;
浮动步长v=1.0/600.0;
浮动tmp1;
浮动tmp2;
浮动tmp3;
浮动tmp4;
浮动tmp5;
浮动tmp6;
浮动tmp7;
浮动tmp8;
浮动tmp9;
//水平索贝尔######
tmp1=texture2D(s_baseMap,coordVar.st+vec2(-stepH,stepV)).r*sobelHoriz[0][0];
tmp3=texture2D(s_baseMap,coordVar.st+vec2(stepH,stepV)).r*sobelHoriz[2][0];
tmp4=texture2D(s_baseMap,coordVar.st+vec2(-stepH,0.0)).r*sobelHoriz[0][1];
tmp6=texture2D(s_baseMap,coordVar.st+vec2(stepH,0.0)).r*sobelHoriz[2][1];
tmp7=(texture2D(s_baseMap,coordVar.st+vec2(-stepH,-stepV)).r*sobelHoriz[0][2]);
tmp9=(texture2D(s_baseMap,coordVar.st+vec2(stepH,-stepV)).r*sobelHoriz[2][2]);
pixelHSobel=tmp1+tmp3+tmp4+tmp6+tmp7+tmp9+0.5;
//垂直索贝尔#######
tmp1=texture2D(s_baseMap,coordVar.st+vec2(-stepH,stepV)).r*sobelVert[0][0];
tmp2=texture2D(s_baseMap,coordVar.st+vec2(0.0,stepV)).r*sobelVert[1][0];
tmp3=texture2D(s_baseMap,coordVar.st+vec2(stepH,stepV)).r*sobelVert[2][0];
tmp4=texture2D(s_baseMap,coordVar.st+vec2(-stepH,0.0)).r*sobelVert[0][1];
tmp5=texture2D(s_baseMap,coordVar.st+vec2(0.0,0.0)).r*sobelVert[1][1];
tmp6=texture2D(s_baseMap,coordVar.st+vec2(stepH,0.0)).r*sobelVert[2][1];
tmp7=(texture2D(s_baseMap,coordVar.st+vec2(-stepH,-stepV)).r*sobelVert[0][2]);
tmp8=(texture2D(s_baseMap,coordVar.st+vec2(0.0,-stepV)).r*sobelVert[1][2]);
tmp9=(texture2D(s_baseMap,coordVar.st+vec2(stepH,-stepV)).r*sobelVert[2][2]);
pixelVSobel=tmp1+tmp2+tmp3+tmp4+tmp5+tmp6+tmp7+tmp8+tmp9+0.5;
像素=(sqrt(像素体*像素体+像素体*像素体));

如果(像素使用帧缓冲区对象(FBO)将sobel过滤写入纹理,而不是屏幕上的帧缓冲区。然后可以绑定此纹理而不是原始图像,并对其应用另一个过滤过程

因此,操作顺序大致如下:

  • 将原始图像绑定为纹理源
  • 将目标纹理绑定为FBO颜色附件
  • 通过sobel着色器将原始图像渲染到目标FBO
  • 将目标纹理作为FBO颜色附件解除绑定,并作为纹理源绑定
  • 将次目标纹理绑定为FBO颜色附件
  • 转到第三步,根据需要重复

  • 我们需要一些代码,你目前如何编写过滤后的图像?你是否使用load\u store\u图像,你是否使用FBO、readpixels等?抱歉,我无法将代码放入注释中,因此我更新了问题,希望你能帮助:)