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
C++ CUDA图像处理错误_C++_Image Processing_Cuda_Cimg - Fatal编程技术网

C++ CUDA图像处理错误

C++ CUDA图像处理错误,c++,image-processing,cuda,cimg,C++,Image Processing,Cuda,Cimg,我正在做一个小的图像处理项目。我想运行一个CUDA程序,做图像减法。所以你有一个图像背景和一个具有相同背景的图像,但是上面有一些其他的东西。一旦你减去这些图像,你就会得到剩下的。这两个图像的大小都是480*360,我的gpu是GTX780。我的程序抛出错误/main]:free():下一个大小无效(正常):0x000000000126bd70*** 中止(堆芯转储)且输出图像错误。我一直在绞尽脑汁解决这个问题。代码如下: 内核: __global__ void add(unsigned char

我正在做一个小的图像处理项目。我想运行一个CUDA程序,做图像减法。所以你有一个图像背景和一个具有相同背景的图像,但是上面有一些其他的东西。一旦你减去这些图像,你就会得到剩下的。这两个图像的大小都是480*360,我的gpu是GTX780。我的程序抛出错误
/main]:free():下一个大小无效(正常):0x000000000126bd70***
中止(堆芯转储)
且输出图像错误。我一直在绞尽脑汁解决这个问题。代码如下:

内核:

__global__ void add(unsigned char* a, unsigned char* b, unsigned char* c, int numCols, int numWidth) {
    int i = blockIdx.x * blockDim.x + threadIdx.x; //Column
    int j = blockIdx.y * blockDim.y + threadIdx.y; //Row
    if(i < numWidth && j < numCols)
    {
      int idx = j * numCols + i;
      c[idx] = b[idx] - a[idx];
    }   
}
\uuuuu全局\uuuuuu无效添加(无符号字符*a、无符号字符*b、无符号字符*c、int numCols、int numWidth){
int i=blockIdx.x*blockDim.x+threadIdx.x;//列
int j=blockIdx.y*blockDim.y+threadIdx.y;//行
如果(i
主要功能是:

int main() {
    CImg<unsigned char> img1("1.bmp");
    CImg<unsigned char> img2("2.bmp");
    //both images have the same size
    int width = img1.width();
    int height = img1.height();

    int size = width * height * 3; //both images of same size

    dim3 blockSize(16, 16, 1);
    dim3 gridSize((width + blockSize.x - 1) / blockSize.x, (height + blockSize.y - 1) / blockSize.y, 1);

    unsigned char *dev_a, *dev_b, *dev_c;

    cudaMalloc((void**)&dev_a, size * (sizeof(unsigned char)));
    cudaMalloc((void**)&dev_b, size * (sizeof(unsigned char)));
    cudaMalloc((void**)&dev_c, size * (sizeof(unsigned char)));

    cudaMemcpy(dev_a, img1, size * (sizeof(unsigned char)), cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b, img2, size * (sizeof(unsigned char)), cudaMemcpyHostToDevice);

    add<<<gridSize, blockSize>>>(dev_a, dev_b, dev_c, height, width);

    cudaMemcpy(img2, dev_c, size * (sizeof(unsigned char)), cudaMemcpyDeviceToHost);

    img2.save("out.bmp");
    cudaFree(dev_a);
    cudaFree(dev_b);
    cudaFree(dev_c);
    return 0;
}
intmain(){
cimgimg1(“1.bmp”);
cimgimg2(“2.bmp”);
//两幅图像的大小相同
int width=img1.width();
int height=img1.height();
int size=width*height*3;//两个图像大小相同
dim3块大小(16,16,1);
dim3网格大小((宽度+块大小.x-1)/blockSize.x,(高度+块大小.y-1)/blockSize.y,1);
未签名字符*dev_a、*dev_b、*dev_c;
cudamaloc((void**)和dev_a,size*(sizeof(unsigned char));
cudamaloc((void**)和dev_b,size*(sizeof(unsigned char));
cudamaloc((void**)和dev_c,size*(sizeof(unsigned char));
cudaMemcpy(dev_a,img1,size*(sizeof(unsigned char)),cudaMemcpyHostToDevice);
cudaMemcpy(dev_b,img2,size*(sizeof(unsigned char)),cudaMemcpyHostToDevice);
添加(偏差a、偏差b、偏差c、高度、宽度);
cudaMemcpy(img2,dev_c,size*(sizeof(unsigned char)),cudaMemcpyDeviceToHost);
img2.save(“out.bmp”);
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(开发中心);
返回0;
}

图像将与库一起加载

问题在于主机代码中不正确使用cimg容器。根据,图像数据指针通过
data()
方法访问,这意味着主机代码中的
cudaMemcpy
调用应随
img1.data()
img2.data()
一起提供


[此答案由评论汇总而成,并作为社区wiki条目添加]

int idx=j*numCols+i前面加
j@mman没有针对该设备的its。如果它在主机上,它将是普通的malloc或new。问题在于字节数,我认为分配的字节数会少一些,这不会使程序崩溃,但要么你找到的内存是所需内存的3倍,要么你只计算了三分之一(你使用的是
size=width*height*3
,然后将width和height传递为numWidth和numHeight)。img1的大小是多少?我是说sizeof?在
cudaMemcpy
操作中,你不应该使用
img1.data()
而不是
img1
img2.data()
而不是
img2
?如何检索指向底层数据的指针:“此内存缓冲区的地址可以通过函数CImg::data()检索。”