Как выполнить Обратные вызовы в Objective C

Аппроксимация модели полиномиального радиального искажения, которую вы можете найти в Fitzgibbon, 2001, равна

enter image description here

, где rd и ru - расстояния от центра искажения. Это также используется для фильтрации искажений изображения широкоугольной камеры для целей компьютерного зрения и обработки изображений.

Более подробное объяснение принципа и кода шейдера для реализации фильтрации искажения (а также прямого преобразования) можно найти здесь: http://marcodiiga.github.io/radial-lens-undistortion- filtering

Я также публикую статьи, на которые стоит обратить внимание, если вы хотите узнать математические подробности метода, который я опубликовал

  • Чжан З. (1999 ). Гибкая калибровка камеры путем просмотра плоскости с неизвестной ориентацией
  • Andrew W. Fitzgibbon (2001). Одновременная линейная оценка геометрии нескольких видов и искажения линзы

118
задан ROMANIA_engineer 25 August 2017 в 17:09
поделиться

2 ответа

Обычно обратные вызовы в объекте C выполняются с делегатами. Вот пример реализации настраиваемого делегата:


Заголовочный файл:

@interface MyClass : NSObject {
    id delegate;
}
- (void)setDelegate:(id)delegate;
- (void)doSomething;
@end

@interface NSObject(MyDelegateMethods)
- (void)myClassWillDoSomething:(MyClass *)myClass;
- (void)myClassDidDoSomething:(MyClass *)myClass;
@end

Файл реализации (.m)

@implementation MyClass
- (void)setDelegate:(id)aDelegate {
    delegate = aDelegate; /// Not retained
}

- (void)doSomething {
    [delegate myClassWillDoSomething:self];
    /* DO SOMETHING */
    [delegate myClassDidDoSomething:self];
}
@end

Это иллюстрирует общий подход. Вы создаете категорию в NSObject, в которой объявляются имена ваших методов обратного вызова. NSObject фактически не реализует эти методы. Этот тип категории называется неформальным протоколом, вы просто говорите, что многие объекты могут реализовывать эти методы. Это способ пересылки объявления сигнатуры типа селектора.

Затем у вас есть объект, который является делегатом «MyClass», и MyClass вызывает соответствующие методы делегата для делегата. Если обратные вызовы ваших делегатов являются необязательными, вы обычно охраняете их на сайте отправки с помощью чего-то вроде " слабый обратный указатель. В противном случае, если что-то поддерживает экземпляр MyClass, у вас будет висящий указатель.

94
ответ дан 24 November 2019 в 01:55
поделиться

Вот пример, который не раскрывает концепции делегатов и просто выполняет необработанный обратный вызов.

@interface Foo : NSObject {
}
- (void)doSomethingAndNotifyObject:(id)object withSelector:(SEL)selector;
@end

@interface Bar : NSObject {
}
@end

@implementation Foo
- (void)doSomethingAndNotifyObject:(id)object withSelector:(SEL)selector {
    /* do lots of stuff */
    [object performSelector:selector withObject:self];
}
@end

@implementation Bar
- (void)aMethod {
    Foo *foo = [[[Foo alloc] init] autorelease];
    [foo doSomethingAndNotifyObject:self withSelector:@selector(fooIsDone:)];
}

- (void)fooIsDone:(id)sender {
    NSLog(@"Foo Is Done!");
}
@end

Обычно метод - [Foo doSomethingAndNotifyObject: withSelector:] будет асинхронным, что сделает обратный вызов более полезен, чем здесь.

49
ответ дан 24 November 2019 в 01:55
поделиться