使用gpu编程时,计算两张图的不同的代码如下,debug了两天了,因为是初学者,怎么也想不出是哪里的问题,导致图像一部分会缺失,不管裁剪多小的图,都会存在y方向的部分缺失,想知道这是什么问题?(ps 假设 cal difference没有错误)
__global__ void Cal_difference_Kernel(const uchar* R_max_tolerance, const uchar* R_min_tolerance, const uchar* I_max_tolerance, const uchar* I_min_tolerance, const uchar* src_image, const uchar* ref_model, uchar *dst, int rows, int cols) {
int x = (threadIdx.x + blockIdx.x * blockDim.x);
int y = (threadIdx.y + blockIdx.y * blockDim.y);
if (x >= cols || y >= rows) {
return;
}
dst[y * cols + x] = cal_difference((int)R_max_tolerance[y*cols+x],(int)R_min_tolerance[y*cols+x],(int)I_max_tolerance[y*cols+x],(int)I_min_tolerance[y*cols+x],(int)src_image[y*cols+x], (int)ref_model[y*cols+x]); //设置dst为0或1 ,初始为0
}
extern "C"
void Cal_difference_gpu(const Mat& ref,const Mat& src,const Mat& result) {
auto t1 = std::chrono::system_clock::now();
cv::cuda::GpuMat ref_model(ref);
cv::cuda::GpuMat src_image(src);
cv::cuda::GpuMat R_max_tolerance(ref.size(), CV_8UC1);
cv::cuda::GpuMat R_min_tolerance(ref.size(), CV_8UC1);
cv::cuda::GpuMat I_max_tolerance(ref.size(), CV_8UC1);
cv::cuda::GpuMat I_min_tolerance(ref.size(), CV_8UC1);
// ...这里省略了一些tolerance计算
cv::cuda::GpuMat Difference(ref.size(), CV_8UC1,Scalar(0));
dim3 block(32, 32);
dim3 grid((ref.rows -1 ) / 32 + 1 , (ref.cols - 1) / 32 +1 ); // 向上取整
Cal_difference_Kernel<<<grid, block>>>(R_max_tolerance.ptr<uchar>(),R_min_tolerance.data,I_max_tolerance.ptr<uchar>(),I_min_tolerance.ptr<uchar>(),src_image.ptr<uchar>(), ref_model.ptr<uchar>(), Difference.ptr<uchar>(), ref.rows, ref.cols);
cudaDeviceSynchronize();
Difference.download(result);
//cudaFree((void*)differ_data);
}
缺失效果如下 : (截了部分图)