我从事有关自动驾驶汽车的项目。在此项目中,使用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();
}
}
答案 0 :(得分:3)
首先,您必须要解决一个问题,可以将其分解为多个子问题。图像处理就是这样的问题。对您有好处,您可以考虑拆分问题。
您的系统一次可以执行多于1个线程的情况-多核,多线程或超线程或任何其他情况。如果我对您的理解正确,Pi一次最多可以处理4个线程。很好,您已准备好使用多线程程序。
回答您的问题:主线程是否使用所有4个内核?基本上没有,主线程只有一个线程,它在一个内核上运行。您的测量线程将在另一个内核上运行。
因此,您想将图像处理分成多个线程。当您仅将图像处理放入主线程的一个额外线程中时,您几乎看不到任何改进。您必须将图像分成多个部分,并至少放入两个线程中。我建议一种通用方法,在该方法中可以轻松更改线程数,因此您可以尝试一下最快的设置是什么。
简而言之,您不能期望我们给出明确的答案。这取决于您的实现和系统,它还需要做什么以及数据存储的位置……等等等等……但是,如果您读了一些好书并明智地选择了实现方法,图像处理,我希望它能改善性能。
如果您擅长估算,则可以使用数学方法。 LINK对此进行了详细说明。
并行化公式:
S(n) = 1/( (1-P) + P/n )
这基本上是说,使用n个内核可以看到的程序加速量取决于程序有多少是串行的(只能在单个CPU内核上运行)以及有多少是并行的(可以在多个CPU内核之间分配)。