【问题标题】:OpenCV Segmentation fault (core dumped) While Using cv::Mat::at使用 cv::Mat::at 时的 OpenCV 分段错误(核心转储)
【发布时间】:2018-01-27 09:42:36
【问题描述】:

我正在尝试将 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)

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

【问题讨论】:

  • 什么是fr?这个条件无效:x &lt; fr,应该是x &lt; frame.columns
  • @MarekR 啊,是的。错字...谢谢!
  • 图片的分辨率是多少?
  • 那么,你看到答案了吗?

标签: c++ opencv segmentation-fault opencv3.2


【解决方案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));

【讨论】:

  • 你知道这很奇怪......我只是想可能图像加载不好所以我尝试imshow通过我的眼睛看到Mat?然后它工作......在imshow之后,它工作......奇怪......
  • 我知道 y 是行索引。您在调用 frame.at/ 时反转了索引。它应该是 y,x。试试吧。看看它是否有效。将此标记为答案,然后在迷雾中前进!
  • @GyuHyeon Choi - 你还在吗?能否请您点击左上方的绿色复选标记?
  • cv::Mat 对象以行优先顺序进行索引。首先是行,然后是列。你的 y 是行。因此正确的调用是 frame.at<:vec3b>(y,x)。见stackoverflow.com/questions/8184053/…
  • 你得到分割错误的原因是你的图像不是正方形的。因此,尝试使用 col,row 而不是正确的 row,col 访问它会将 Mat 索引到超出范围。很容易验证。我不知道沟通问题是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-23
  • 2020-07-14
  • 1970-01-01
  • 2015-06-25
  • 2021-06-03
相关资源
最近更新 更多