Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV3.0:将每个进程分布在不同的内核上,以加快处理速度。_C++_Multithreading_Opencv - Fatal编程技术网

C++ OpenCV3.0:将每个进程分布在不同的内核上,以加快处理速度。

C++ OpenCV3.0:将每个进程分布在不同的内核上,以加快处理速度。,c++,multithreading,opencv,C++,Multithreading,Opencv,我的项目的目标是优化我的OpenCV程序,以利用处理器上可用的所有内核。 我正在使用Core-i3和2个四核ARM板来测试各种OpenCV应用程序的性能。我对一些策略很陌生,比如多线程等 下面是一个用于行检测的小示例代码: void line_detect::detect(UMat & src) { Mat threshold, HSV; cvtColor(src, HSV, CV_BGR2HSV); inRange(HSV, Scalar(H_MIN, S_MIN, V_MIN),

我的项目的目标是优化我的OpenCV程序,以利用处理器上可用的所有内核。 我正在使用Core-i3和2个四核ARM板来测试各种OpenCV应用程序的性能。我对一些策略很陌生,比如多线程等

下面是一个用于行检测的小示例代码:

void line_detect::detect(UMat & src)
{

Mat threshold, HSV;
cvtColor(src, HSV, CV_BGR2HSV);

inRange(HSV, Scalar(H_MIN, S_MIN, V_MIN), Scalar(H_MAX, S_MAX, V_MAX), threshold);

erode(threshold, threshold, getStructuringElement(MORPH_ELLIPSE, Size(6, 6)));
dilate(threshold, threshold, getStructuringElement(MORPH_ELLIPSE, Size(3, 3)));

vector<Vec4i> lines;

HoughLinesP(threshold, lines, 1, CV_PI / 180, 50, 50, 10);
for (size_t i = 0; i < lines.size(); i++)
{
    Vec4i l = lines[i];
    line(src, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, CV_AA);
}

imshow("Threshold", threshold);

imshow("Lines detected", src);

cvWaitKey(30);
}
如何在两个不同的内核上运行cvtColor和inRange等函数来并行化此代码?如何实时检查不同的核心性能

OS-Win10
IDE-Visual studio 2015

您不需要制作并行算法,如cvtColor和侵蚀/扩张。它已经在内部并行,并在受支持的平台上提供最高性能

您只需要使用一些并行后端构建OpenCV。在Windows上,它可能是并发、TBB、OpenMP等。请确保在cmake日志中启用了此选项之一

例如:

...    
Parallel framework:            Concurrency
...
说明如何构建OpenCV


在大多数情况下,如果在函数之外并行这些算法,则不会获得性能优势。

我已经在启用OpenMP和OpenCL的情况下编译了OpenCV。我同意你的看法,但我能在Windows上看到实时内核性能吗?为什么它被否决了?你知道如何在单独的线程中运行任何随机函数吗?如果是,这个案例有什么特别之处?首先阅读一篇线程教程,然后你将能够提出有用的后续问题。是的,我知道穿线的基本知识。但多线程并不意味着在不同的内核上运行进程。多线程也可以在单核上完成。多线程和多处理是完全不同的概念。我上面的问题是关于多重处理的。1您的代码是顺序代码,因为您需要在运行inRange之前完成cvtColor。所以你不能把这个片段并行化。2除了Hough之外,这段代码应该非常快,因此启动新进程/线程和移动计算可能会比较慢。多处理也不意味着在不同的内核上运行进程,而且您可以使用多核多线程,所以不,您还不知道线程的基本知识。这正是否决投票所需要的东西,mousover有这样一个文本:这个问题没有显示任何研究成果;这是不清楚或没有用处。