【问题标题】:OpenCV Aborted (core dumped) When the Window Is Closed关闭窗口时 OpenCV 中止(核心转储)
【发布时间】:2018-01-26 19:17:48
【问题描述】:

我尝试读取相机帧,并使用cv::cuda::GpuMat 通过cv::namedWindow 显示它。

这是我的 C++ 代码:

cv::namedWindow("frame", cv::WINDOW_OPENGL);
cv::resizeWindow("frame", FRAME_WIDTH, FRAME_HEIGHT);
while (true) {
    cv::Mat frame;
    cv::cuda::GpuMat frame_gpu;

    camera.read(frame);
    frame_gpu.upload(frame);

    cv::imshow("frame", frame_gpu);

    //frame_gpu.download(frame);

    if (cv::waitKey(1) == 27) {
        break;
    }
}
cv::destroyAllWindows();

如果我关闭窗口,我会收到此错误:

OpenCV Error: The function/feature is not implemented (You should explicitly call download method for cuda::GpuMat object) in getMat_, file /home/nvidia/opencv-3.2.0/modules/core/src/matrix.cpp, line 1276
terminate called after throwing an instance of 'cv::Exception'
what():  /home/nvidia/opencv-3.2.0/modules/core/src/matrix.cpp:1276: error: (-213) You should explicitly call download method for cuda::GpuMat object in function getMat_

Aborted (core dumped)

如果我键入Esc 键来结束逻辑,它不会引发任何异常。

为什么会出现此错误,我该如何解决?

【问题讨论】:

    标签: c++ opencv opencv3.2


    【解决方案1】:

    我猜这个错误是关于你试图使用 imshow 显示GpuMat 图像。您需要先将其下载到另一个Mat,然后才能使用imshow 显示。 试试这个

    cv::Mat host;
    frame_gpu.upload(frame);
    frame_gpu.download(host)
    cv::imshow("frame", host);
    

    【讨论】:

    • 那么使用cv::cuda::GpuMat没有任何优势吗?
    • 您期望以您的方式使用 GpuMat 获得什么样的优势?
    • @GyuHyeon Choi 你看到了在 GPU 上处理 GpuMat 的优势。您正在做的是将 Mat 从 CPU 复制到 GPU,反之亦然,仅此而已。也许尝试阅读 GPU 的实际作用。 opencv.org/platforms/cuda.html
    • 呃...我省略了代码的其他部分以使其更具可读性。 GPU有很多事情要做,所以我认为如果GpuMat.download有点贵,最好将GpuMat传递给imshow
    • 是的!它是昂贵的。从 CPU 上传和下载到 GPU 需要时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多