基于OpenCV的程序在最小的Linux嵌入式系统上进行优化

时间:2017-11-30 16:32:21

标签: c++ opencv raspberry-pi embedded-linux buildroot

我正在使用Buildroot为Raspberry PI3构建自己的嵌入式Linux操作系统。该操作系统将用于处理多个应用程序,其中一个应用程序基于OpenCV(v3.3.0)执行对象检测。

我从Raspbian Jessy + Python开始,但事实证明,执行一个简单的例子需要花费大量时间,因此我决定使用优化功能+ C ++开发而不是Python来设计我自己的RTOS。

我认为通过这些优化,RPI的4个内核+ 1GB RAM将处理此类应用程序。问题是,即使使用这些东西,最简单的计算机视觉程序也需要花费很多时间。

PC vs. Raspberry PI3 Comparaison

这是一个简单的程序,我写的是了解程序各部分执行时间的数量级。

#include <stdio.h>
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

#include <time.h>       /* clock_t, clock, CLOCKS_PER_SEC */

using namespace cv;
using namespace std;

int main()
{
    setUseOptimized(true);
    clock_t t_access, t_proc, t_save, t_total;

    // Access time.
    t_access = clock();
    Mat img0 = imread("img0.jpg", IMREAD_COLOR);// takes ~90ms
    t_access = clock() - t_access;

    // Processing time
    t_proc = clock();
    cvtColor(img0, img0, CV_BGR2GRAY); 
    blur(img0, img0, Size(9,9));// takes ~18ms
    t_proc = clock() - t_proc;

    // Saving time
    t_save = clock();
    imwrite("img1.jpg", img0);
    t_save = clock() - t_save;

    t_total = t_access + t_proc + t_save;

    //printf("CLOCKS_PER_SEC = %d\n\n", CLOCKS_PER_SEC);

    printf("(TEST 0) Total execution time\t %d cycles \t= %f ms!\n", t_total,((float)t_total)*1000./CLOCKS_PER_SEC);
    printf("---->> Accessing  in\t %d cycles \t= %f ms.\n", t_access,((float)t_access)*1000./CLOCKS_PER_SEC);
    printf("---->> Processing in\t %d cycles \t= %f ms.\n", t_proc,((float)t_proc)*1000./CLOCKS_PER_SEC);
    printf("---->> Saving     in\t %d cycles \t= %f ms.\n", t_save,((float)t_save)*1000./CLOCKS_PER_SEC);

    return 0;
}

在i7 PC上执行的结果 enter image description here

在Raspberry PI上执行的结果(从Buildroot生成的操作系统) enter image description here

正如您所看到的,存在巨大差异。我需要的是优化每一个细节,以便这个示例处理步骤发生在&#34; near&#34;实时,最长15ms处理时间,而不是44ms 。所以这些是我的问题:

  • 如何优化我的操作系统,以便它可以处理密集的计算应用程序以及如何控制每个部分的优先级?
  • 如何完全使用RPI3的4个核心来满足要求?
  • 还有其他可能性而不是OpenCV吗?
  • 我应该使用C代替C ++吗?
  • 您推荐的任何硬件改进?

1 个答案:

答案 0 :(得分:2)

据我所知,你想得到大约30-40fps。在你的I7的情况下:它是快速的并且由itel默认启用加速技术的音调。在树莓派的情况下:嗯,我们喜欢它,但它很慢,特别是对于图像处理程序。

如何优化操作系统以便它可以处理密集型计算应用程序以及如何控制每个部分的优先级?

You should include some acceleration library for arm and re-compiled opencv again with those features enabled. 

如何完全使用RPI3的4个核心来满足要求?

Paralleling your code so it could run on 4 cores 

还有其他可能性而不是OpenCV吗?

Ask your self first, what features do you need from OpenCV.

我应该使用C而不是C ++吗?

Changing language will not help you at all, stay and love C++. It is a beautiful language and very fast

您推荐的任何硬件改进?

How about other board with mali GPU supported. So you could run opencv code directly on GPU, that will boost up your speed a lot.