Debian系统编译opencv-2.4.9库利用S5P6818多核来加速图像处理

前言: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生成的工程文件目录

Debian系统编译opencv-2.4.9库利用S5P6818多核来加速图像处理_第1张图片


    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

   4. 查看进程IP为1365的系统信息

fa@NanoPi3:~/work/test$    ls /proc/1365/task/
1365  1366  1367  1368  1369  1370 


    可以看到有6个线程,有一个线程是主线程,另外开了5个线程,说明可以控制线程数目,也就是控制处理核心数目。性能提升因应用场景而异,我曾经做过的一个项目利用多核加速,性能提高50% 。


附上效果图


你可能感兴趣的:(linux系统,Opencv图像处理,opencv,linux,多核,debian,图像处理)