如何在许多主机上分发opencv处理

时间:2016-04-18 08:26:22

标签: opencv apache-spark docker parallel-processing distributed-computing

我正在开发一个耗费CPU的opencv应用程序。

我想让帧处理分布,以便在许多主机之间共享。

这个想法与http://cloudcv.org/中实现的想法相同。但问题是你只能将你的请求发送到他们的服务器来测试分布式图像处理。

我在互联网上搜索了很长时间,我想知道我是否可以实现opencv + Docker Swarm,或opencv + Apache Spark,或者是否有其他方法可以分发它。

我的代码处理opencv中的帧以检测其中的人,我想让它在许多主机上执行以最大化速度:

while(true)
{
                       webcam.read(image);
                        //human detection--------------------------------------
                        cv::Mat resized_image;
                        cv::resize(image, resized_image, Size(image.cols / 2, image.rows / 2), 0, 0, INTER_LINEAR);
                        vector<Rect> found, found_filtered;
                        // this line uses hog descriptor to detect 
                        // people body pattern in the frmaes
                        // found is a vector of Rect that contains the 
                        // found peoples. 
                        // Rect is a struct (x, y, height, width)
                        hog.detectMultiScale(image, found, 0, Size(8, 8), Size(32, 32), 1.05, 2);
                        size_t u, h;
                        // this loop just make sure that the found
                        // rectangles are not duplicated.
                        for (u = 0; u<found.size(); u++)
                        {
                            Rect r = found[u];
                            for (h = 0; h<found.size(); h++)
                                if (h != u && (r & found[h]) == r)
                                    break;
                            if (h == found.size())
                                found_filtered.push_back(r);
                        }
                        // this loop is for drawing the rectangles on the frame
                        for (u = 0; u<found_filtered.size(); u++)
                        {
                            Rect r = found_filtered[u];
                            r.x += cvRound(r.width*0.1);
                            r.width = cvRound(r.width*0.8);
                            r.y += cvRound(r.height*0.07);
                            r.height = cvRound(r.height*0.8);
                            rectangle(showed_image, r.tl()*2, r.br()*2, Scalar(0, 255, 0), 3);
                            cout << '\a';
                        }
    }

1 个答案:

答案 0 :(得分:3)

Spark是在分布式系统上进行处理的好方法。但它没有一个强大的社区致力于OpenCV。 Storm是另一个Apache的免费开源分布式实时计算系统。 Storm可以轻松可靠地处理无限数据流,实时处理Hadoop为批处理所做的工作。

StormCV是Apache Storm的扩展,专门用于支持分布式计算机视觉管道的开发。 StormCV通过添加计算机视觉(CV)特定操作和数据模型,可以将Storm用于视频处理。该平台使用OpenCV进行大多数CV操作,并且将此库用于其他功能相对容易。

有一些使用OpenCV风暴的例子。 有一个类似的例子,你正在尝试他们的官方github页面。您可能希望查看此人脸检测示例并尝试进行人体检测 - https://github.com/sensorstorm/StormCV/blob/master/stormcv-examples/src/nl/tno/stormcv/example/E2_FacedetectionTopology.java