

有没有老哥知道这个问题怎么解决呢,已经在vs里面配置了cuda和OpenCV了,就这一个小错误迟迟不能解决。
关注让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。
如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!
根据您提供的代码和错误信息,问题出在CUDA内核函数centroid_kernel的调用和定义上。主要问题包括语法错误、拼写错误和参数传递问题。以下是修正后的代码和解决方案:
__global__ void centroid_kernel(unsigned char* img, float* centers, int width, int height, int threshold) {
int y = blockIdx.x * blockDim.x + threadIdx.x;
if (y >= height) return;
float sumx = 0.0f, sumval = 0.0f;
for (int x = 0; x < width; x++) {
float val = img[y * width + x];
if (val > threshold) {
sumx += x * val;
sumval += val;
}
}
centers[y] = (sumval != 0) ? (sumx / sumval) : -1.0f;
}
void process_image(const fs::path& input_path, const fs::path& output_dir) {
cv::Mat img = cv::imread(input_path.string(), cv::IMREAD_GRAYSCALE);
if (img.empty()) return;
const int width = img.cols;
const int height = img.rows;
const size_t img_size = width * height * sizeof(uchar);
unsigned char* d_img;
float* d_centers;
cudaMalloc(&d_img, img_size);
cudaMalloc(&d_centers, height * sizeof(float));
cudaMemcpy(d_img, img.data, img_size, cudaMemcpyHostToDevice);
const int block_size = 256;
const int grid_size = (height + block_size - 1) / block_size;
centroid_kernel<<<grid_size, block_size>>>(d_img, d_centers, width, height, 30);
std::vector<float> centers(height);
cudaMemcpy(centers.data(), d_centers, height * sizeof(float), cudaMemcpyDeviceToHost);
cv::Mat result;
cv::cvtColor(img, result, cv::COLOR_GRAY2BGR);
for (int y = 0; y < height; y++) {
if (centers[y] >= 0 && centers[y] < width) {
cv::circle(result, cv::Point2f(centers[y], y), 1, cv::Scalar(0, 0, 255), -1);
}
}
}
gentroid kernel → centroid_kernelunsigned char# → unsigned char*blockldx.x → blockIdx.x,threadlds.x → threadIdx.xblack_size → block_sizecv::THREAD_GRAYSCALE → cv::IMREAD_GRAYSCALE&& 运算符周围添加了空格cudart.lib和OpenCV的库文件如果仍有E0029错误,请检查:
需要更详细的错误信息可以检查VS的输出窗口中的完整编译错误。