5

我有一个 c++-cli 代码,它使用捕获从 opencv 中的文件夹捕获视频,然后使用 cvquery 帧检索帧。然后我处理帧,一旦处理完所有帧,我就会释放捕获。它工作正常,但是当我尝试多线程时,它给了我一个警告,并且无法捕获文件夹中的一些视频,并发出警告“avcodec_open/close() 周围的线程锁定不足”。

//for each video in folder do
{
    capture=cvCreateFileCapture(filename);

    while(1)
    {
        img=cvqueryframe(capture) 

        if !img break;
        ///process img
    }

    cvreleasecapture(&capture);
}

有没有办法解决多线程问题?我正在考虑使用

while(!capture) 
    capture=cvCreateFileCapture(filename);

但应该有更有效的方法,也许使用锁定 Monitor::Enter(obj) 或 lock(obj)?

4

1 回答 1

10

avcodec 中的openandclose函数不是线程安全的。为了防止多线程应用程序中出现问题,他们有一个简单的机制,可以检测两个线程何时同时在这些函数中,并在发生这种情况时写入“线程锁定不足”消息。

防止此消息的方法是锁定对cvCreateFileCaptureand的调用cvreleasecapture(依次调用avcodec_openand avcodec_close)以确保这些调用始终是序列化的。例如,如果您有一个名为 Mutex 的互斥类,您可以执行以下操作:

extern Mutex m; // application-wide mutex

//for each video in folder do
{
    m.lock();
    capture=cvCreateFileCapture(filename);
    m.unlock();

    while(1)
    {
        img=cvqueryframe(capture) 

        if !img break;
        ///process img
    }

    m.lock();
    cvreleasecapture(&capture);
    m.unlock();
}

有许多 Mutex 实现。在 Linux 或 OS X 上,您可以使用pthread mutexes。在 Windows 上,您可以使用Win32 mutexes

于 2012-09-03T07:19:54.907 回答