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