如何结合opencv和多线程?

时间:2014-04-23 08:40:16

标签: c++ multithreading opencv

我是一个新的软件开发人员。我使用OPENCV开发一个OCR项目。我想分割图像,并将图像的一部分视为一个孤立的图像。我想到了一个想法,为什么我不使用多线程来最小化和优化执行时间。 谁有一个链接或一个在C ++中结合opencv和多线程的例子 非常感谢。

3 个答案:

答案 0 :(得分:2)

使用C ++ 11,您可以使用内置的thread类来创建多个线程。您可以像执行函数一样将参数传递给这些线程。请注意,多个线程可能会产生比解决问题更多的问题!

答案 1 :(得分:1)

您可以使用TBB。这是一个例子:

#include "tbb/parallel_for.h"
#include "tbb/blocked_range.h"

using namespace tbb;
class TaskPool {
    Mat image; /**< Image to process  */
    Task** t_vector;

public:
    // This empty constructor with an initialization list is used to setup calls to the function
    TaskPool(cv::Mat frame, Task** current_tasks)
    {
        image = frame;
        t_vector = current_tasks;
    }

  /*----------------------------------------------------------+
   | Here is the actual body, that will be called in parallel |
   | by the TBB runtime. You MUST put this code inside the    |
   | class definition, since the compiler will be expanding   |
   | and inlining this code as part of the template process.  |
   |                                                          |
   | The blocked_range<int> is something like a list of       |
   | indexes corresponding to each invocation of the function |
   +----------------------------------------------------------*/
    void operator() ( const blocked_range<int>& r ) const
    {
        for ( int i = r.begin(); i != r.end(); i++ )
        { // iterates over the entire chunk
            t_vector[i]->run(image);
        }

    }
};

// Here is the call to the parallelized code
void RunTasks(const Mat&image)
{
    // Each Task is a class containing a run(const Mat&) method which process some region of the image (e.g. calculates the histogram or whatever)
    vector<Task*> taskVector;
    // ... create/initialize the tasks here

    /// Do the TBB parallel stuff
    int k = trackVector.size();
    parallel_for(blocked_range<int>(0,k),
                 TaskPool(image,&(taskVector[0])));

}

如您所见,您拥有处理Task类中每个图像区域的代码。然后,当你调用parallel_for传递TaskPool构造函数时,它将处理多线程的东西。

另一个选项包括OpenMP,它可以更容易使用(它还包括parallel for),但在尝试将其与某些版本的GCC编译器一起使用时遇到了一些麻烦。

答案 2 :(得分:0)

Opencv支持使用具有许多基本功能的线程,如cvtColor。这取决于你如何编译opencv lib。

查看opencv parallel_for以获取更多信息。