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


    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 <opencv2/opencv.hpp>
#include <stdio.h>
#include <sys/time.h>
#include <omp.h>
#include <unistd.h>

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% 。


附上效果图


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛文旺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值