/** Publishes a new filter called 'name'.
The constructor object 'anObject' should implement the filterWithName: method.
That method will be invoked with the name of the filter to create.
The class attributes must have a kCIAttributeFilterCategories key associated with a set of categories.
@param attributes Dictionary of the registration attributes of the filter. See below for attribute keys.
*/
+ (void)registerFilterName:(NSString *)name
constructor:(id<CIFilterConstructor>)anObject
classAttributes:(NSDictionary<NSString *,id> *)attributes NS_AVAILABLE(10_4, 9_0);
ROI ( region of interest ),在一定的时间内特别感兴趣的区域,即当前处理区域。
可以简单的理解为:当前处理区域对应于原图中的哪个区域。
ROI 的定义如下:
/* Block callback used by Core Image to ask what rectangles of a kernel's input images
* are needed to produce a desired rectangle of the kernel's output image.
*
* 'index' is the 0-based index specifying which of the kernel's input images is being queried.
* 'destRect' is the extent rectangle of kernel's output image being queried.
*
* Returns the rectangle of the index'th input image that is needed to produce destRect.
* Returning CGRectNull indicates that the index'th input image is not needed to produce destRect.
* The returned rectangle need not be contained by the extent of the index'th input image.
*/
typedef CGRect (^CIKernelROICallback)(int index, CGRect destRect);
CIKernelROICallback 在 Core Image 内部进行处理的时候,会多次调用。
index 表示输入图片的下标,顺序和 kernel 中的入参顺序一致,从0开始。
destRect 表示输出图片的区域。 也就是我们先前设置的 DOD。
那,我们为什么要显示设置 ROI 呢 ?
因为输入图片中,参与处理的实际区域,Core Image 是无法知道的,我们需要显式的告诉 CI 这个区域。
这么讲可能有点难以理解,下面我们看两个具体的例子。
CGRect dod = CGRectMake(inputImage.extent.origin.y, inputImage.extent.origin.x, inputImage.extent.size.height, inputImage.extent.size.width);
// e.g.
// 原图片extent (0, 0, 200, 300)
// 旋转后的输出图片 (0, 0, 300, 200),也就是 DOD
那 ROI 应该怎么设置呢 ?我们之前说过,ROI 计算就是计算当前处理区域对应于原图中的哪个区域。
也就是一个逆向过程。
假如,A:输入图片中的某点 B:输出图片中的某点。那么 ROI 计算可以理解成 ROI(B)= A。