前言:opencv是一个开源的图像处理库,S5P6818是三星八核Cortex-A53的CPU,有的官方opencv库进行图像处理时不支持多核加速,通常只有一个核心来处理,造成“一核有难,多核围观”的局面,现在我们来重新配置、编译opencv-2.4.9的源码,增加WITH_OPENMP这个配置项,使opencv库支持openmp(openmp是一种共享内存并行系统的多处理器程序设计的一套指导性编译处理方案),这样编译出来的库就具有多核处理能力了。
一、环境
硬件:这里选用友善之臂NANOPC-T3开发板
软件:Debian系统
二、准备工作
1. 软件更新
fa@NanoPi3:~/work$ sudo apt-get update
2. 安装cmake-gui和unzip解压工具
fa@NanoPi3:~/work$ sudo apt-get install cmake-gui
fa@NanoPi3:~/work$ sudo apt-get install unzip
3. 下载opencv-2.4.9源码,可以到官网下载或者到我的资源下载opencv_test在windows上解压后可以得到
链接:http://download.csdn.net/download/wenwang88/10154796
4. 在linux系统上解压opencv-2.4.9源码
fa@NanoPi3:~/work$ unzip opencv-2.4.9.zip
5.创建两个目录build和temp,build存放Makefile等文件,temp存放编译出来的opencv库文件
fa@NanoPi3:~/work$ mkdir build
fa@NanoPi3:~/work$ mkdir temp
三、 使用cmake配置,生成Makefile等文件
1. 打开cmake图形界面程序
2. 指定opencv-2.4.9源码目录和存放cmake生成的工程文件目录
3. 选择编译器类型
4. 第一次配置
5. 选择opencv库的安装目录
6. 增加WITH_OPENMP这个配置项,支持openmp
7. 同理,去掉WITH_FFMPEG、WITH_TIFF这两个选项
8. 第二次配置
9. 生成Makefile等文件
四、编译和安装opencv库
1. 编译
fa@NanoPi3:~/work$ cd build
fa@NanoPi3:~/work/build$ make
2. 安装
fa@NanoPi3:~/work/build$ make install
3. 复制opencv库文件到指定的目录,以后供编译应用程序使用
fa@NanoPi3:~/work/build$ cd ../temp/
fa@NanoPi3:~/work/temp$ sudo cp lib/* /usr/lib/ -rfd
fa@NanoPi3:~/work/temp$ sudo cp lib/* /lib/arm-linux-gnueabihf -rfd
fa@NanoPi3:~/work/temp$ sudo cp lib/* /usr/lib/arm-linux-gnueabihf/ -rfd
fa@NanoPi3:~/work/temp$ sudo cp include/* /usr/include -rf
五、测试
1. 源码identifity.cpp:函数cvSetNumThreads(n)可以控制线程数目,每一个线程对应一个核心,可以利用多核加速处理
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
#define DEBUG 1
#if DEBUG
struct timeval tPreTime ;
struct timeval tCurTime ;
long delta;
#endif
int main(int argc, char** argv)
{
Mat srcimage;
Mat hsvimage;
Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
/* 设置线程数,每一个线程对应一个核心,可以利用多核加速处理 */
cvSetNumThreads(5);
while (1)
{
srcimage =imread("test.jpg");
#if DEBUG
gettimeofday(&tCurTime, NULL);
#endif
if (srcimage.empty())
{
printf("srcimage.empty()\n");
continue;
}
cvtColor(srcimage, hsvimage, COLOR_BGR2HSV);
//二值化
inRange(hsvimage, Scalar(25, 25, 130), Scalar(150, 240, 255), hsvimage);
erode(hsvimage, hsvimage, element);
dilate(hsvimage, hsvimage, element);
imshow("srcimage", srcimage);
imshow("hsvimage", hsvimage);
waitKey(1);
#if DEBUG
gettimeofday(&tPreTime, NULL);
delta = ( tPreTime.tv_sec - tCurTime.tv_sec ) *1000 + (tPreTime.tv_usec -tCurTime.tv_usec) /1000;
printf("process one frame: %ld\n",delta);
#endif
}
return 0;
}
2. 编译、执行
fa@NanoPi3:~/work/test$ g++ identifity.cpp -o identifity -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_ml -lpthread
fa@NanoPi3:~/work/test$ ./identifity
3. 查看进程IP
fa@NanoPi3:~/work/test$ ps -aux | grep identifity
fa 1365 228 0.6 68464 5964 pts/0 Sl+ 22:30 0:04 ./identifity
fa 1372 0.0 0.0 4132 780 pts/3 S+ 22:30 0:00 grep identifity
fa@NanoPi3:~/work/test$ ls /proc/1365/task/
1365 1366 1367 1368 1369 1370
可以看到有6个线程,有一个线程是主线程,另外开了5个线程,说明可以控制线程数目,也就是控制处理核心数目。性能提升因应用场景而异,我曾经做过的一个项目利用多核加速,性能提高50% 。
附上效果图