【问题标题】:How to Implement GPUImage Filter in Opencv API?如何在 Opencv API 中实现 GPUImage 过滤器?
【发布时间】:2014-09-23 00:02:16
【问题描述】:

我想在 Opencv API 中实现 GPUImage 框架过滤器。我知道 IOS 中的 GPUImage sketchfilter。但我想在 windows 平台上使用 Opencv API 实现 GPUImage 过滤器。

下面是我的输入图片

这里我想得到下面的输出图像

我将如何获得以上输出图像。?

是否有任何opencv API 来获取结果图像?

请帮忙并提出任何建议。?

【问题讨论】:

    标签: c++ c windows opencv


    【解决方案1】:

    您正在寻找的是边缘检测器,例如 Canny Detector

    这会将边缘返回为暗线,对比度越强,边缘越暗。


    如果你对提供的检测器不满意(应该不止Canny,但说实话我已经好几年没用过OpenCV了),你可以实现自己的边缘检测:

    output[y * stride + x] = std::abs(input[y * stride + x] - input[y * stride + x + 1]);
    

    此示例将在不使用任何阈值的情况下查找所有垂直边缘。

    横版类似:

    output[y * stride + x] = std::abs(input[y * stride + x] - input[(y + 1) * stride + x]);
    

    或两者合二为一:

    output[y * stride + x] = ((std::abs(input[y * stride + x] - input[y * stride + x + 1]) + std::abs(input[y * stride + x] - input[(y + 1) * stride + x]))) / 2;
    

    但是,更常见的是简单地使用一些内核并使用它来实现许多不同的过滤器(模糊、边缘检测等)

    更多详情可以在Image Filtering (Filter2D)找到。

    一个简单的边缘检测器可以使用这样的内核:

        |  0 -1  0 |
    K = | -1  0  1 |
        |  0  1  0 |
    

    【讨论】:

    • 感谢您的回复。但是 Canny 边缘检测使用阈值执行。但我需要在不使用阈值的情况下获取输出。
    • @2vision2 用更简单的算法更新了答案。
    • 感谢您的回答。您能解释一下代码中的“步幅”吗?是垫子吗?
    • 感谢您的回答。但它绘制垂直和水平线。如何仅绘制边缘的外线。?
    • 你的意思是你想减少噪音?如果是这样,那就是阈值发挥作用的地方(例如丢弃颜色值低于x 的所有内容)。
    【解决方案2】:

    这看起来像 Sobel 边缘检测。既然你想用 OpenCV 在 GPU 上做,here is the relevant function

    【讨论】:

    • 这在 iOS 中不可用,因为 gpu 仅在 nVidia CUDA 显卡上启用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多