OpenCV 3.1 警告和使用 Umat 时崩溃

Posted

技术标签:

【中文标题】OpenCV 3.1 警告和使用 Umat 时崩溃【英文标题】:OpenCV 3.1 warning and crash in usage of UMat 【发布时间】:2017-01-10 23:13:09 【问题描述】:

我是使用 OpenCV 的新手。我在 Visual Studio 2013 和 opencv 3.1 中使用 c++。我想计算 Canny 边缘,这是我的代码:

UMat getImage()

    return imread("...\\myPic.jpg").getUMat(ACCESS_FAST);


int _tmain(int argc, _TCHAR* argv[])

    UMat u;
    u = getImage();

    cv::Canny(u, u, 100, 50);

    namedWindow("Display window", WINDOW_AUTOSIZE);// Create a window for display.
    imshow("Display window", u);

    getchar();

    return 0;

我看不到结果或任何图像。而不是它,我看到了这个窗口:

怎么了? 我注意到如果使用Mat 实例,我可以看到我的照片。

【问题讨论】:

【参考方案1】:

你写的代码有两个问题。

1) imshow 不会在没有暂停的情况下正确显示您的图像。您需要在 imshow 之后添加函数 waitkey(0) 以使图像正确显示结果。

2) 在处理 UMat 变量时,最好接收并返回参考矩阵,而不是返回整个矩阵,因为 UMat 内存并不总是在 CPU 空间中。 这是您的代码的外观

void getImage(cv::OutputArray u)

    cv::imread("...\\myPic.jpg").getUMat(cv::ACCESS_FAST).copyTo(u);


  int main(int argc, const char** argv)
    
        cv::UMat u;
        getImage(u);

        cv::Canny(u, u, 100, 50);

        cv::namedWindow("Display window", cv::WINDOW_AUTOSIZE);// Create a window for display.
        cv::imshow("Display window", u);
        cv::waitKey(0);
        getchar();

        return 0;
    

祝你好运

【讨论】:

以上是关于OpenCV 3.1 警告和使用 Umat 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Opencv学习笔记 - 关于OpenCV的UMat 类

缺少 OpenCV 透明 API UMat

OpenCV OpenCL 线程安全 - 死锁(将 cv::Mat 更改为 UMat)

OpenCV TypeError: Expected cv::UMat for argument 'src' - 这是啥?

namedWindow() 导致 opencv 2.3.1 崩溃? (在 XP、C++ 上的 Eclipse+MinGW)

使用 Python 的 OpenCV 函数裁剪图像 [重复]