- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试在 CUDA 中实现一维数组的 HAAR 小波变换。
我在输入数组中有 8 个索引
有了这个条件if(x_index>=o_width/2 || y_index>=o_height/2)
我将有4个线程,应该是0,2,4,6,我计划处理两个输入中每个索引的索引。
我计算 avg.EG:如果我的线程 id 为“0”,则 avg 为 (input[0]+input[1])/2,然后同时我得到输入的差异[ 0]-avg 等其余线程。
现在重要的是输出的放置。我为输出创建了一个单独的 thread_id,因为使用索引 0、2、4、6 会导致将输出放置在正确的索引中产生困难。
我的 avgs 应该放在前 4 个索引中,即输出的 0,1,2,3,o_thread_id 应该是 0,1,2,3。同样,为了将差异放在 4,5,6,7 处,我用“4”增加了 0,1,2,3,如代码所示
我的输出全为零!!!无论我改变什么,我都会得到它。
__global__ void cal_haar(int input[],float output [],int i_widthstep,int o_widthstep,int o_width,int o_height)
{
int x_index=blockIdx.x*blockDim.x+threadIdx.x;
int y_index=blockIdx.y*blockDim.y+threadIdx.y;
if(x_index>=o_width/2 || y_index>=o_height/2) return;
int i_thread_id=y_index*i_widthstep+(2*x_index);
int o_thread_id=y_index*o_widthstep+x_index;
float avg=(input[i_thread_id]+input[i_thread_id+1])/2;
float diff=input[i_thread_id]-avg;
output[o_thread_id]=avg;
output[o_thread_id+4]=diff;
}
void haar(int input[],float output [],int i_widthstep,int o_widthstep,int o_width,int o_height)
{
int * d_input;
float * d_output;
cudaMalloc(&d_input,i_widthstep*o_height);
cudaMalloc(&d_output,o_widthstep*o_height);
cudaMemcpy(d_input,input,i_widthstep*o_height,cudaMemcpyHostToDevice);
dim3 blocksize(16,16);
dim3 gridsize;
gridsize.x=(o_width+blocksize.x-1)/blocksize.x;
gridsize.y=(o_height+blocksize.y-1)/blocksize.y;
cal_haar<<<gridsize,blocksize>>>(d_input,d_output,i_widthstep,o_widthstep,o_width,o_height);
cudaMemcpy(output,d_output,o_widthstep*o_height,cudaMemcpyDeviceToHost);
cudaFree(d_input);
cudaFree(d_output);
}
以下是我的主要功能:-
void main()
{
int in_arr[8]={1,2,3,4,5,6,7,8};
float out_arr[8];
int i_widthstep=8*sizeof(int);
int o_widthstep=8*sizeof(float);
haar(in_arr,out_arr,i_widthstep,o_widthstep,8,1);
for(int c=0;c<=7;c++)
{cout<<out_arr[c]<<endl;}
cvWaitKey();
}
你能告诉我哪里出了问题吗?它给了我零作为输出?谢谢。
最佳答案
您的代码存在以下问题:
if(x_index>=o_width/2 || y_index>=o_height/2) return;
给定o_height = 1
,我们有o_height/2 = 0
(o_height
是int
,所以我们这里有整数除法并向下舍入),因此没有线程执行任何操作。要实现您想要的效果,您可以在此处进行浮点算术,或使用 (o_height+1)/2
和 (o_width+1)/2
:它将执行使用“算术”舍入进行除法(您将得到 ( x_index >= (8+1)/2/*= 4*/&& y_index >= (1+1)/2/*= 1*/)
)
此外,当 Y 维度上有超过 1 个线程时,寻址会出现问题,因为那时您的 i_thread_id
和 o_thread_id
计算将是错误的( _withstep
是以字节为单位的大小,但您将其用作数组索引)。
关于cuda - CUDA 中的 HAAR 小波变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10726090/
我使用 lire, java对于图像检索项目,我想为输入图像的每个像素计算 gabor 小波的振幅 ref here . lire 库中的默认函数返回一个下采样的特征向量。我想要的是 gabor 小波
我目前有一个 Java 程序可以获取图像中每个像素的 rgb 值。我还有一种在二维值矩阵上计算 Haar 小波的方法。但是我不知道应该为计算 Haar 小波的方法赋予哪些值。我应该平均每个像素的 rg
我正在尝试对图像进行小波分析,我需要一些多尺度分解方法。我正在试验 PyWavelets 包。但是,dwt2 和 idwt2 方法仅提供单一比例。我可以重复这些方法,并将单尺度分解应用于图像的较小区域
我是 OpenCV 和 gabor 过滤器的新手,只想获得这样的 gabor 小波: 我在 Java 中使用这个 OpenCV 代码: double sigma_bar = 40; double th
我正在尝试从声音文件(.wav)中获取特征; 我尝试过 stft 来获取 2D 特征(x 是时间,y 是频率) 我尝试过 pywt,但得到的是一维数组。如果我输入一个 1D (1000,) wav 数
我是一名优秀的程序员,十分优秀!