Computer vision OpenCL像素检查

Computer vision OpenCL像素检查,computer-vision,opencl,gpgpu,gpu,Computer Vision,Opencl,Gpgpu,Gpu,我有一个opencl内核,可以对图像进行一些扭曲。这是一个正向映射,每个内核实例处理源图像中一个像素的映射/扭曲。这意味着一些内核实例(源图像中的像素)映射到相同的目标像素。这意味着我无法控制将什么值写入目标图像中的那些像素。它们只获取最后执行write命令的内核实例的值。如果我正在写入已写入的位置(像素),是否有方法进行检查?我有一个我正在扭曲的图像的深度图,理想情况下,如果更多的像素映射到同一位置,我想写最前面的像素,这可能吗 __kernel void dwarpIntThree(__re

我有一个opencl内核,可以对图像进行一些扭曲。这是一个正向映射,每个内核实例处理源图像中一个像素的映射/扭曲。这意味着一些内核实例(源图像中的像素)映射到相同的目标像素。这意味着我无法控制将什么值写入目标图像中的那些像素。它们只获取最后执行write命令的内核实例的值。如果我正在写入已写入的位置(像素),是否有方法进行检查?我有一个我正在扭曲的图像的深度图,理想情况下,如果更多的像素映射到同一位置,我想写最前面的像素,这可能吗

__kernel void dwarpIntThree(__read_only image2d_t src,
        __read_only image2d_t dispmap,
        float T,
        __write_only image2d_t dst,
        sampler_t sampler,
        int dmin, int dmax,
        sampler_t sampler_1, float posx, float posy
                    ){
int2 srcCoords = (int2)( get_global_id(0), get_global_id(1));

if ((srcCoords.x >= get_image_width(dst)) | (srcCoords.y >= get_image_height(dst)))
    return;

float true_depth = round((read_imagef(dispmap, sampler, srcCoords).x)*(dmax-dmin)+dmin);

int2 uv;
uv.x = srcCoords.x-true_depth*(posx/T);
uv.y = srcCoords.y-true_depth*(posy/T);

if ((uv.x >= get_image_width(dst)) || (uv.y >=get_image_height(dst))| (uv.x < 0) | (uv.y < 0)){
    return;}

float4 srcPixel = read_imagef(src, sampler, srcCoords);

write_imagef(dst, uv, srcPixel);
}
\uuuuuu内核无效矮化三个(\uuuuu只读图像2d\uu t src,
__只读图像2D显示图,
浮动T,
__仅写入图像2D测试,
采样器,
intdmin,intdmax,
采样器\u t采样器\u 1,浮子位置X,浮子位置Y
){
int2 srcCoords=(int2)(get_global_id(0),get_global_id(1));
如果((srcCoords.x>=get_image_width(dst));(srcCoords.y>=get_image_height(dst)))
返回;
浮动真实深度=圆形((读取图像f(dispmap,sampler,srcCoords).x)*(dmax dmin)+dmin);
int2紫外线;
uv.x=srcCoords.x-真实深度*(posx/T);
uv.y=srcCoords.y-真实深度*(posy/T);
如果((uv.x>=获取_图像_宽度(dst))|(uv.y>=获取_图像_高度(dst))|(uv.x<0)|(uv.y<0)){
返回;}
float4 srcPixel=读取图像f(src、采样器、srcCoords);
写入图像f(dst、uv、srcPixel);
}

所以我想做的是只把src中当前像素的_imagef写入dst中的坐标uv,如果它的深度小于src中可能的像素,它也映射到uv。但是我不知道是否可以检查,因为内核当然是并发执行的

这很难。首先,输出图像是只写的。如果使用读写缓冲区,则工作项之间存在争用。原子操作可以解决这个问题,但速度很慢

是否可以重新设计使用反向映射?您必须更改深度贴图所表示的内容


我认为使用OpenGL和利用深度缓冲会更合适。

你能分享一些代码吗?如果它们连接到同一个目的地,那么它们是串行的吗?不,显示的代码是针对src图像中的每个像素并行执行的。问题是,更多的像素可以映射到dst图像中相同的uv坐标。你想计算一些东西,然后按顺序写入相同的像素吗?