-2

我正在尝试将cv::Mat像素映射到float4*CUDA 计算。

cv::Mat frame = cv::imread("peds-007.png", cv::IMREAD_COLOR);

cudaAllocMapped((void**) cpu, (void**) gpu,
                frame.cols * frame.rows * sizeof(float) * 4);

float4* cpuPtr = *cpu;
for (uint32_t y = 0; y < frame.rows; y++) {
    for (uint32_t x = 0; x < frame.cols; x++) {
        std::cout << x << ", " << y << std::endl;
        const float4 px = make_float4(float(frame.at<cv::Vec3b>(x, y)[2]),
                                      float(frame.at<cv::Vec3b>(x, y)[1]),
                                      float(frame.at<cv::Vec3b>(x, y)[0]),
                                      float(255));
                                      //float(frame.at<cv::Vec4b>(x, y)[3]));         
        cpuPtr[y*imgWidth+x] = px;
    }
}

如果我运行上面的代码,我得到了Segmentation fault (core dumped).

代码访问的最后一个像素位于 (1662, 0)。

如果我直接访问循环外的像素:

frame.at<cv::Vec3b>(1662, 0);

这也导致Segmentation fault (core dumped).

为什么会发生这种情况,我该如何解决这个问题?

4

1 回答 1

1

cv::Mat 以行优先顺序索引。颠倒你的x和y。

const float4 px = make_float4(float(frame.at<cv::Vec3b>(y,x)[2]),
                              float(frame.at<cv::Vec3b>(y,x)[1]),
                              float(frame.at<cv::Vec3b>(y,x)[0]),
                              float(255));
于 2017-08-18T19:31:44.970 回答