Opencv 带有颜色和覆盖的GPUImage CannyEdge检测过滤器

Opencv 带有颜色和覆盖的GPUImage CannyEdge检测过滤器,opencv,gpuimage,edge-detection,Opencv,Gpuimage,Edge Detection,我能够运行单个过滤器并创建多个过滤器链。当我需要混合多个操作的结果时,我的问题就开始了。我当前的用例是在原始图像上覆盖一个罐头过滤器。canny和original都是独立过滤链的一部分。我想做的是将精明的结果(用红线或绿线)覆盖在原始图像的50%alpha上 不透明度为50%的原始图像来自: GPUImageSolidColorGenerator * white = [[GPUImageSolidColorGenerator alloc] init]; [white setColorRed:25

我能够运行单个过滤器并创建多个过滤器链。当我需要混合多个操作的结果时,我的问题就开始了。我当前的用例是在原始图像上覆盖一个罐头过滤器。canny和original都是独立过滤链的一部分。我想做的是将精明的结果(用红线或绿线)覆盖在原始图像的50%alpha上

不透明度为50%的原始图像来自:

GPUImageSolidColorGenerator * white = [[GPUImageSolidColorGenerator alloc] init];
[white setColorRed:255 green:255 blue:255 alpha:1.0];
[white forceProcessingAtSize:self.view.frame.size];

[sourcePicture addTarget:alphaFilter];
[white addTarget:alphaFilter];
[sourcePicture processImage];
我怎样才能把上面的结果和倒转的Canny混合起来呢?
如果我的Canny输出可以是红色或绿色,则可获得额外点数

为此,我建议创建Canny边缘检测过滤器的自定义变体,或使用自定义过滤器修改其输出

现在,过滤器当前实现的最后一个阶段是,如果没有边缘,则输出不透明的黑色,如果有边缘,则输出不透明的白色。这使得它有点棘手的混合或覆盖在其他东西

要修改Canny边缘检测器,您可以从框架中复制它,将其重命名为您想要调用的名称,复制gpuimageweakpixenclusionfilter(该过滤器中的最后一个阶段)并将其重命名。修改新的Canny过滤器,以在最后阶段指向经过调整并重命名的GPUImageWeakPixenClusionFilter。在新的gpuimageweakpixenclusionfilter中,更改颜色输出,使其不再发送白色,而是发送边缘所需的任何颜色,并将黑色替换为非边缘所需的任何颜色和不透明度


一个简单的替代方案,虽然性能稍差,但可以创建一个自定义过滤器,只将白色和黑色更改为您想要的任何颜色。它可以使用一个简单的单步函数根据一个颜色组件(例如红色)进行切换,如果通过,则输出一种颜色,如果失败,则输出另一种颜色。您只需要一个自定义着色器和一个GPUImageFilter实例就可以做到这一点。如果您只想修改此输出的颜色,您甚至可以避免混合的需要。

谢谢您,这是一个很好的建议!我对代码进行了分叉,并为WeakPixel和Canny过滤器添加了自定义颜色。不仅为了得到正确的颜色,我还可以跳过与白色混合的步骤。你能分享你的自定义颜色WeakPixel自定义过滤器吗。谢谢