用户
 找回密码
 立即注册
zxl112358 该用户已被删除
发表于 2013-4-11 11:45:19
17300
本人写了个程序,读入bmp格式图片并对其进行均值滤波处理,输出总是不对,求助大神!!!
#include <windows.h>
#include <stdio.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
#include "book.h"

# define N 0.11111111111111111111111111111111
# define M 0.33333333333333333333333333333333
__global__ void kernel(int *bmp,float *pBmpBuf,float *ptr)
{
        long int x = threadIdx.x + blockIdx.x * blockDim.x;
        long int y = threadIdx.y + blockIdx.y * blockDim.y;
        long int offset = x + y * blockDim.x * gridDim.x;
        ptr[offset]=pBmpBuf[offset];
        if (offset<(bmp[1]*bmp[3]))
        {
                if (bmp[2]==8)               
                {
                        if (offset/bmp[3]!=0)
                        {
                                if (offset/bmp[3]!=(bmp[1]-1))
                                {
                                        if (offset%bmp[3]!=0)
                                        {
                                                if (offset%bmp[3]!=(bmp[3]-1))//判断边界,不对边界信息进行运算
                                                {
                                                            ptr[offset]=(float)((pBmpBuf[offset-bmp[3]-1]+pBmpBuf[offset-bmp[3]]+pBmpBuf[offset-bmp[3]+1]
                                                                                    +pBmpBuf[offset-1]+pBmpBuf[offset]+pBmpBuf[offset+1]
                                                                                    +pBmpBuf[offset+bmp[3]-1]+pBmpBuf[offset+bmp[3]]+pBmpBuf[offset+bmp[3]+1])*N);
                                                }
                                        }
                                }
                        }
                }
        }
        __syncthreads();
}

int main()
{
        FILE *fid;
        int bmpWidth,bmpHeight,biBitCount,lineByte;
        int bmp[4];
        int *dev_bmp;
        RGBQUAD  *pColorTable;//颜色表指针
        float *pBmpBuf,*ptr;   //读入图像数据的指针
        float *dev_ptr,*dev_pBmpBuf;
        dim3 dimGrid(16,16);
        dim3 dimBlock(16,16);
        fid=fopen("D:\\testnoise.bmp","rb");
        if (fid==0)
        {
                printf("cannot open file");
                return 0;
        }
        fseek(fid,sizeof(BITMAPFILEHEADER),0);//跳过位图文件头结构BITMAPFILEHEADER
        BITMAPINFOHEADER head;//定义位图信息结构变量,读取位图信息头进内存,存放在变量head中
        fread(&head,sizeof(BITMAPINFOHEADER),1,fid);//获取图像信息
        bmpWidth=head.biWidth;
        bmpHeight=head.biHeight;
        biBitCount=head.biBitCount;
        lineByte=(bmpWidth*biBitCount/8+3)/4*4;
        bmp[0]=bmpWidth;bmp[1]=bmpHeight;bmp[2]=biBitCount;bmp[3]=lineByte;
        if(biBitCount==8)
        {
                pColorTable=new RGBQUAD[256];
                fread(pColorTable,sizeof(RGBQUAD),256,fid);
        }
        pBmpBuf=new float[lineByte*bmpHeight];//定义,读取位图信息
        ptr=new float[lineByte*bmpHeight];//滤波存放位图信息
        fread(pBmpBuf,1,lineByte*bmpHeight,fid);
        fclose(fid);
        printf("width=%d,height=%d, biBitCount=%d ,lineByte=%d\n",bmpWidth,bmpHeight, biBitCount,lineByte);
        //分配内存
        HANDLE_ERROR( cudaMalloc( (void**)&dev_bmp,4*sizeof(int) ) );
        HANDLE_ERROR( cudaMalloc( (void**)&dev_ptr,lineByte*bmpHeight*sizeof(ptr) ) );
        HANDLE_ERROR( cudaMalloc( (void**)&dev_pBmpBuf,lineByte*bmpHeight*sizeof(pBmpBuf) ) );

        // copy the arrays to the GPU
        HANDLE_ERROR( cudaMemcpy( dev_bmp,bmp,4*sizeof(int),cudaMemcpyHostToDevice ) );
        HANDLE_ERROR( cudaMemcpy( dev_pBmpBuf,pBmpBuf,lineByte*bmpHeight*sizeof(pBmpBuf),cudaMemcpyHostToDevice ) );

        kernel<<<dimGrid,dimBlock>>>(dev_bmp,dev_pBmpBuf,dev_ptr);

        HANDLE_ERROR( cudaMemcpy(ptr,dev_ptr,lineByte*bmpHeight*sizeof(ptr),cudaMemcpyDeviceToHost ) );

        HANDLE_ERROR( cudaFree( dev_bmp ) );
        HANDLE_ERROR( cudaFree( dev_pBmpBuf ) );
        HANDLE_ERROR( cudaFree( dev_ptr ) );
        //写文件没给出

}
请问是哪里的问题?

使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册