线程化会影响Raspberry Pi上的图像处理性能吗?

时间:2019-04-19 09:01:12

标签: c++ multithreading opencv image-processing raspberry-pi

我从事有关自动驾驶汽车的项目。在此项目中,使用C ++中的Opencv 4.0在Raspberry Pi(型号3B)上进行了实时视频处理。车辆前部还有距离传感器,该传感器与休闲障碍物的距离较远。任务是在1米之内有障碍物的情况下停下汽车。

为实现此任务,我在编程结构中采用了线程。我将图像处理设计为主螺纹,并将距离传感器测量设计为侧螺纹。我担心的是这种结构是否会影响图像处理速度。你有什么主意吗?另外我不知道主线程是否使用Raspberry Pi的4个内核?如果是这样,是否会在结构拆分核心中引入一个线程,将其作为3个用于图像处理,将1个用于距离传感器测量?

我对此感到困惑。可以在下面的代码段中看到我头脑中的设计(请注意,主线程无限循环):

int measuredDistance;
int distanceThreshold = 1; // 1 meter

void * sensor_thread(void * threadid) {
   // measure distance
   // update measuredDistance 
}

int main () {
   while(1){
      // do image processing
      if (measuredDistance < distanceThreshold)
         stopTheCar();
   }
}

1 个答案:

答案 0 :(得分:3)

首先,您必须要解决一个问题,可以将其分解为多个子问题。图像处理就是这样的问题。对您有好处,您可以考虑拆分问题。

您的系统一次可以执行多于1个线程的情况-多核,多线程或超线程或任何其他情况。如果我对您的理解正确,Pi一次最多可以处理4个线程。很好,您已准备好使用多线程程序。

回答您的问题:主线程是否使用所有4个内核?基本上没有,主线程只有一个线程,它在一个内核上运行。您的测量线程将在另一个内核上运行。

因此,您想将图像处理分成多个线程。当您仅将图像处理放入主线程的一个额外线程中时,您几乎看不到任何改进。您必须将图像分成多个部分,并至少放入两个线程中。我建议一种通用方法,在该方法中可以轻松更改线程数,因此您可以尝试一下最快的设置是什么。

简而言之,您不能期望我们给出明确的答案。这取决于您的实现和系统,它还需要做什么以及数据存储的位置……等等等等……但是,如果您读了一些好书并明智地选择了实现方法,图像处理,我希望它能改善性能。

如果您擅长估算,则可以使用数学方法。 LINK对此进行了详细说明。

并行化公式:

S(n) = 1/( (1-P) + P/n )
  • S(n)是理论上的加速
  • P是算法中可以并行化的部分
  • n是CPU线程数
  

这基本上是说,使用n个内核可以看到的程序加速量取决于程序有多少是串行的(只能在单个CPU内核上运行)以及有多少是并行的(可以在多个CPU内核之间分配)。