opencv 回调例程

xurqigkl  于 2023-11-22  发布在  其他
关注(0)|答案(6)|浏览(91)

Learning OpenCV这本书中,我提到了callback这个术语,有时候它和routine一起用作callback routine
我们说callback是什么意思?
谢谢.

o7jaxewo

o7jaxewo1#

  • 什么是回调函数?*

简单来说,回调函数就是程序员不显式调用的函数,而是有某种机制不断等待事件的发生,它会调用选定的函数来响应特定的事件。
此机制通常在操作(函数)需要很长的执行时间,函数的调用者不想等到操作完成,但希望被告知操作的结果。通常,回调函数有助于实现这样的异步机制 *,其中,调用者注册以获得关于耗时处理的结果的初始化,并且继续其它操作,而在稍后的时间点,调用者得到关于结果的通知。

  • 一个实际例子:*

Windows事件处理:
实际上所有的windows程序都建立了一个事件循环,使程序响应特定的事件。(例如按钮按下,选择复选框,窗口获得焦点)通过调用函数。方便的是,程序员可以指定当(比如)按下特定按钮时调用什么函数,即使无法指定何时按下按钮。被调用的函数称为回调。

  • 源代码示例:*
//warning:  Mind compiled code, intended to illustrate the mechanism    
#include <map>

typedef void (*Callback)();
std::map<int, Callback>  callback_map;

void RegisterCallback(int event, Callback function)
{
    callback_map[event] = function;
}

bool finished = false;

int GetNextEvent()
{
    static int i = 0;
    ++i;
    if (i == 5) finished = false;
}

void EventProcessor()
{
    int event;
    while (!finished)
    {
        event = GetNextEvent();
        std::map<int, Callback>::const_iterator it = callback_map.find(event);
        if (it != callback_map.end())    // if a callback is registered for event
        {
            Callback function = *it;
            if (function)   
            {
                (*function)();
            }
            else
            {
               std::cout << "No callback found\n";
            }
        }
    }
}

void Cat()
{
   std::cout << "Cat\n";
}

void Dog()
{
    std::cout << "Dog\n";
}

void Bird()
{
    std::cout << "Bird\n";
}

int main()
{
    RegisterCallBack(1, Cat);
    RegisterCallback(2, Dog);
    RegisterCallback(3, Cat);
    RegisterCallback(4, Bird);
    RegisterCallback(5, Cat);

    EventProcessor(); 
    return 0;
}

字符串
以上将输出以下内容:

Cat  
Dog   
Cat  
Bird  
Cat


希望这对你有帮助!
注意事项:
从我以前的一个答案中导入了这个答案在这里

bxgwgixi

bxgwgixi2#

“我不会自己调用它,但系统(或其他人)会调用它”。这就是 callback

9rbhqvlz

9rbhqvlz3#

这意味着你传递一个指向过程的指针给OpenCV。当发生某些事情时,这将是called back。这可以在cvSetMouseCallback()中看到。每当鼠标移动时,指针引用的函数将被调用。

vlf7wbxs

vlf7wbxs4#

遵循霍利伍德原则“不要打电话给我们,我们打电话给你”,回调是对一个函数的引用,它被传递给另一个函数。
回调将由它所赋予的函数调用,例如当数据可用或需要执行某些处理步骤时。

6za6bjd0

6za6bjd05#

“例程”在这个上下文中与“函数”相同。这个术语可以追溯到更古老的语言(如Fortran),它们区分了函数(返回值)和(子)例程(不返回值)。
“回调”是一种技术,你提供一个指向你的函数(“例程”)的指针给系统/API/框架,系统/API/框架会在它想这样做的时候调用它。所以一个回调例程,或者简单地说一个回调,是一个用于这种用途的函数。
在严格的对象语言(如Java)中,它们通常使用侦听器和委托来实现这一点。C++形式的回调技术的优点是它与经典C等非面向对象语言兼容。
编辑:在Microsoft C运行时库中,此技术用于qsort()函数。compare参数是指向回调例程的函数指针。每当需要比较两个数组元素时,RTL都会调用它。这不是一个典型的例子,因为所有对compare的调用都发生在qsort()调用返回之前。
在Win32 API中,回调函数是一个重要的组成部分。窗口过程就是一个很好的例子--你在WNDCLASS结构中传递一个指向它的指针,系统在消息到达时回调该过程。在这种情况下,回调例程在RegisterClass()之后很久才被调用--在窗口的整个生命周期内。
在POSIX/Unix/Linux中,信号处理函数就是一个例子。参见signal()系统调用描述。

aor9mmx1

aor9mmx16#

回调函数是没有被显式调用的函数,这种函数在某些事件发生后自动调用,例如在按下“c +c”后生成SIGINT信号,因此处理程序将自动执行。

相关问题