【发布时间】:2014-09-23 00:02:16
【问题描述】:
我想在 Opencv API 中实现 GPUImage 框架过滤器。我知道 IOS 中的 GPUImage sketchfilter。但我想在 windows 平台上使用 Opencv API 实现 GPUImage 过滤器。
下面是我的输入图片
这里我想得到下面的输出图像
我将如何获得以上输出图像。?
是否有任何opencv API 来获取结果图像?
请帮忙并提出任何建议。?
【问题讨论】:
我想在 Opencv API 中实现 GPUImage 框架过滤器。我知道 IOS 中的 GPUImage sketchfilter。但我想在 windows 平台上使用 Opencv API 实现 GPUImage 过滤器。
下面是我的输入图片
这里我想得到下面的输出图像
我将如何获得以上输出图像。?
是否有任何opencv API 来获取结果图像?
请帮忙并提出任何建议。?
【问题讨论】:
您正在寻找的是边缘检测器,例如 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 |
【讨论】:
x 的所有内容)。
这看起来像 Sobel 边缘检测。既然你想用 OpenCV 在 GPU 上做,here is the relevant function。
【讨论】: