问题标签 [cikernel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - 阈值图像适用于 Swift 和 Matlab,但不适用于 Core Image 内核
tl; dr:当我在 Swift 中对具有特定阈值的图像进行阈值处理时,我得到了干净的分割(并在 Matlab 中仔细检查了它是否完全匹配),但是当我在 Core Image 内核中进行处理时,它并没有干净地分割。我的内核中有错误吗?
我正在尝试使用 Core Image 内核设置阈值。我的代码看起来很简单:
我认为这不仅仅是选择一个糟糕的阈值的问题,因为我可以在 Matlab 中使用这个完全相同的阈值并获得清晰的分割:
为了仔细检查,我在纯 Swift 中“重做”内核outputImage
,只是打印到控制台:
这会在 0 和 1 中打印出清晰分割的图像。我无法将其缩小到足以一次将其全部显示在屏幕上,但您可以看到叶子上的孔被清楚地分割:
我担心 Matlab 和内核之间的像素强度可能不同(因为 RGB 到强度可以以不同的方式完成),所以我使用这种控制台打印方法来检查不同像素的确切强度,它们都匹配强度我在 Matlab 中看到相同的图像。由于我在 Swift 和内核之间使用相同的点积,我不知道为什么这个阈值在 Swift 和 Matlab 中有效,但在内核中无效。
有什么想法吗?
ios - 核心映像自定义内核不起作用
我被困在一个非常奇怪的问题上。我有以下非常简单的内核,但每次运行它时,都会收到“无法识别的选择器发送到实例”错误。
如果我添加 samplerTransform,我仍然会得到同样的错误。
但是,如果我将内核更改为以下内容,一切正常,我会返回源图像。这表明我的其余 Objective-c 代码运行良好。所以问题一定出在上述示例中的内核代码中。
知道问题可能是什么吗?
ios - Metal vs GLSL CoreImage 性能
在WWDC session 510中,Apple 工程师提出了对编码CIKernel
的支持,Metal
并声称它应该可以更快地工作。
我已经一起制作了一个测试项目,它在两者中都实现了运动模糊metal
(glsl
代码类似于 510 会话中的代码)。
有时metal kernel
更快,有时glsl kernel
更快,但我绝对看不到metal kernel
性能的一致性和全面更好的表现。应该是这样的,我错过了什么吗?
注意:该项目不会在模拟器上运行,您需要 A8+ 驱动的设备。
swift - 控制台中的 Swift 错误“CIKernel 的 ROI 功能不允许平铺”
完整错误是“无法渲染 921600 像素,因为 CIKernel 的 ROI 功能不允许平铺。” 每次我尝试用翻译转换 ciImage 时。
代码很简单:
进行翻译会导致错误并使我整个屏幕变灰,而不是正常渲染图像。
相关线程,没有与我如何翻译 ciImage 相关的分辨率: iOS 10:CIKernel 的 ROI 功能不允许平铺
ios - 带有 GLSL 的 CIKernel 白色像素
我在 GLSL 中有一个阈值过滤器的 CIKernal,如下所示:
我想检查像素是否为白色。GLSL 中是否有一个简单的命令可以在没有额外计算的情况下执行此操作?
更新**我想摆脱亮度计算。那么有没有办法在不进行上述亮度计算的情况下检查像素是否为白色?
ios - 核心图像内核语言中的纹理(iChannel0,vec2)等价是什么?
如何在核心图像内核语言中转换此着色器语法?
ios - iOS 12 CIKernel 过滤器崩溃
我正在使用以下 CIColorKernel 代码生成 customFilter。
但是,这段代码适用于 iOS 10 / iOS 11 设备。它会在 iOS 12 设备上产生奇怪的崩溃
[CIKernelPool] 16:40:错误:参数具有意外类型“vec4”(应该是采样器类型)col.r = sample(image, samplerTransform(image, finalUV)).r;
[CIKernelPool] 17:40:错误:参数具有意外类型“vec4”(应该是采样器类型) col.g = sample(image, samplerTransform(image, finalUV)).g;
[CIKernelPool] 18:40:错误:参数具有意外类型“vec4”(应该是采样器类型)col.b = sample(image, samplerTransform(image, finalUV)).b;
这似乎发生在所有使用 __sample
. 但是,使用CIColorKernelsampler
代替__sample
CIKernel 并将其转换为 CIKernel 可以解决崩溃问题,但不会产生预期的结果。
xcode - 目标的构建设置中没有“金属编译器”
我正在使用 Xcode 10.1。即使在目标的构建设置中使用搜索功能,我也找不到“金属编译器”或任何与金属相关的东西。
此处描述,可以在 Build Settings 中设置 Metal 设置,但我找不到任何东西:https ://developer.apple.com/documentation/coreimage/cikernel/2880194-init
是被剪掉了还是被替换了?
ios - Metal - 在传递给自定义内核过滤器之前调整视频缓冲区的大小
在我们的 iOS 应用程序中,我们使用使用 Metal 的自定义过滤器(CIKernel/CIColorKernel 包装器)。
假设我们有一个 4K 视频和一个输出大小为 1080p 的自定义视频合成,它在视频缓冲区上应用了高级过滤器。
显然,我们不需要过滤原始大小的视频,这样做我们可能会终止应用程序并发出内存警告(真实故事)。
这是视频过滤管道:
以 4K (asCIImage
)获取缓冲区-->
应用过滤器CIImage
-->
过滤器将CIKernel
Metal
过滤器功能应用到CIImage
-->
将过滤CIImage
后的组合返回
我能想到的唯一两个应用调整大小的地方是在我们将其发送到过滤器进程之前或在Metal
函数内。
我确定我不是第一个遇到这个问题的人
当传入的视频缓冲区太大(内存方面)无法过滤时该怎么办,并且他们需要有效地即时调整大小?之前没有重新编码视频?
ios - 混合时了解卷积核的输出扩展
我想使用基于金属的自定义卷积处理图像,CIKernel
并将结果与其他图像混合到一个合成中。但我在混合过程中观察到奇怪的剪裁行为:
为了说明这一点,我创建了一个简单的组合,如下所示:
当MyCustomFilter
什么都不做(return src.sample(src.coord())
)时,结果如下所示:<a href="https://i.stack.imgur.com/SLGkq.jpg" rel="nofollow noreferrer">
现在,如果我像这样在过滤器中执行实际卷积(中间像素周围的样本像素)
正如您所看到的,在混合时突然向图像添加了一些clamp-to-extend 行为,即使它的extend 仍然是inputImage
.
我观察到 Apple 的卷积过滤器返回一个更大的输出图像,其中还包含一个光环区域,具体取决于过滤器参数。所以我玩了很多,发现如果我告诉内核渲染到更大的范围并在之后裁剪它,混合再次按预期工作:
似乎混合滤镜以某种方式尝试对图像范围之外的像素进行采样,以确定如何填充空白空间。默认情况下这应该是透明的,但似乎单独的卷积操作会增加一些钳位到边缘的行为,即使我没有更改结果范围。
有谁知道这是否是一个错误和/或将自定义卷积过滤器与组合相结合的最佳方法是什么?