【发布时间】:2020-05-06 07:23:09
【问题描述】:
我是 C++ 新手(以及 Cuda 和 OpenCV),所以对于我这边的任何错误,我深表歉意。 我有一个使用 Cuda 的现有代码。最近它使用 .png(已解码)作为输入,但现在我使用相机生成实时图像。这些图像是代码的新输入。这里是:
using namespace cv;
INT height = 2160;
INT width = 3840;
Mat image(height, width, CV_8UC3);
size_t pitch;
uint8_t* image_gpu;
// capture image
VideoCapture camera(0);
camera.set(CAP_PROP_FRAME_WIDTH, width);
camera.set(CAP_PROP_FRAME_HEIGHT, height);
camera.read(image);
// here I checked if image is definitly still a CV_8UC3 Mat with the initial height and width; and it is
cudaMallocPitch(&image_gpu, &pitch, width * 4, height);
// here I use cv::Mat::data to get the pointer to the data of the image:
cudaMemcpy2D(image_gpu, pitch, image.data, width*4, width*4, height, cudaMemcpyHostToDevice);
代码可以编译,但我在最后一行 (cudaMemcpy2D) 收到“抛出异常”,错误代码如下: 在 realtime.exe 的 0x00007FFE838D6660 (nvcuda.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x000001113AE10000。
Google 没有给我答案,我不知道从这里开始。
感谢任何提示!
【问题讨论】:
-
这里源音高(第4个参数)不应该是
width吗? -
如果您的像素类型是
CV_8UC3,为什么要乘以 4,所以是 3 个通道?请确认您的总矩阵数据长度实际上是width*height*3。你也检查了cudaMallocPitch返回值吗?