一种硬件加速OpenCV库中图像处理函数的方法与流程

文档序号:12719012阅读:324来源:国知局

本发明涉及一种硬件加速OpenCV库中图像处理函数的方法。



背景技术:

计算机视觉技术几年来发展成为学术界一个相当成熟的科研领域,目前许多视觉算法来源数十年的科研成果。现在计算机视觉技术正快速渗透到我们生活的方方面面,我们拥有自动驾驶的汽车、能根据我们的每个动作做出反应的游戏机、自动工作的吸尘器、能根据我们手势做出响应的手机,以及其它等视觉产品。

今天我们面临的挑战就是如何高效地实现上述这些及未来的各种视觉系统,同时满足严格的功耗和上市要求。嵌入式系统在计算方面的局限性,尤其是在处理大型图片、高帧率时计算能力低下严重限制了嵌入式系统在计算机/机器视觉实际方面的应用。现有对OpenCV(Open Source Computer Vision Library,计算机视觉函数库)的加速,主要有三种方案:A、GPU的方式,这种方式运行速度快,通用性强,但是GPU厂商基本都没有提供基于Linux的驱动源码,需要开发人员手动移植到对应的嵌入式平台,难度非常的大,对嵌入式系统的开发人员的专业水平要求非常高;B、DSP的方式,这种方式通用性强,但是并行性很差,并且价格昂贵;C、FPGA的方式,这种方式提供了强大的通用处理功能,此外还有稳健可靠的数字处理功能,能够实现计算强度高、存储高效的计算机视觉算法。

Xilinx使用的就是FPGA的方式,利用高层次综合工具Vivado HLS,将OpenCV程序代码转换成硬件描述语言,最后综合成IP核,然后再手动进行软硬件集成。这种方式,需要软硬件开发人员同时参与,并且还需要进行手动软硬件的集成,开发流程复杂,开发效率比较低。

因此,有必要设计一种不但能提高运行速度,而且不需要硬件人员的参与,也不需要手动软硬件进行集成,提高开发效率的硬件加速OpenCV库中图像处理函数的方法。



技术实现要素:

本发明所解决的技术问题是,针对现有技术的不足,提供一种硬件加速OpenCV库中图像处理函数的方法,在保持OpenCV原有库框架的不变的基础上,同时提高了运行速度,而且不需要硬件人员的参与,也不需要手动对软硬件进行集成。

本发明所提供的技术方案为:

一种硬件加速OpenCV库中图像处理函数的方法,包括以下步骤:识别OpenCV库中计算工作量大,运算耗时的图像处理函数,确定为需要进行硬件加速的图像处理函数;然后进行以下处理:

A、从OpenCV库中需要进行硬件加速的图像处理函数中抽取复杂运算的代码,封装成新的函数,确保新的函数中没有再次对OpenCV库中的函数进行调用,都是基本的算术逻辑运算;

B、在需要进行硬件加速的图像处理函数所在文件中定义与新抽取的函数对应的函数指针类型,函数指针类型的函数参数与新抽取的函数的参数保持一致;

C、针对定义的每一个函数指针类型,在需要进行硬件加速的图像处理函数所在文件中定义相应的静态全局变量(就是函数指针);

这些静态全局变量是在OpenCV的库内部定义的,并且在下一步会定义对应的赋值函数,分别给对应的变量进行赋值,这样OpenCV的应用程序,就可以调用OpenCV库中的赋值函数,对这些静态全局变量分别进行赋值;

D、针对每一个静态全局变量,定义一个可供OpenCV应用代码调用的赋值函数,用来对对应的静态全局变量赋值,并且确保赋值函数的函数参数的类型就是静态全局变量对应的函数指针类型;

E、修改OpenCV库中步骤A确定的需要进行硬件加速的图像处理函数:首先,注释掉其对新抽取的函数的调用;然后,将调用的参数传递给步骤C中定义的对应的函数指针类型的静态全局变量,这样就实现了需要进行硬件加速的图像处理函数的内部代码改成对静态全局变量的函数指针的调用;

F、重新编译OpenCV库,生成动态链接库,供OpenCV应用代码调用;

G、在OpenCV应用代码中,定义新的硬件加速函数,其函数参数与步骤B中定义的函数指针类型的函数参数保持一致,其完成的功能与步骤A中抽取出来的函数的功能相同,并且确保其内部不再调用OpenCV的库函数;在应用代码中,定义硬件加速函数,就是将原来OpenCV库中完成的功能,改由OpenCV应用代码来实现;

H、OpenCV应用代码在初始化的时候,会调用OpenCV动态链接库中相应的赋值函数,将步骤G中定义的硬件加速函数作为参数传给该赋值函数,从而实现对库中对应静态全局变量的赋值;

OpenCV应用代码对OpenCV库中需要进行硬件加速的图像处理函数进行函数调用时,其内部代码会调用静态全局变量的函数指针,由于此时静态全局变量的函数指针已被赋值函数赋值为应用代码中的硬件加速函数,从而实现对应用代码中的硬件加速函数的调用;

I、通过Xilinx SDSOC开发平台,将步骤G中定义的硬件加速函数改成由FPGA硬件逻辑来实现。

步骤A到F在保持OpenCV低层库框架不变的情况,通过函数指针调用替换原有功能函数,生成新的动态库。步骤G和H在应用层完成原有低层库函数的功能。

本发明公开了一种硬件加速OpenCV的图像处理方法,

有益效果:

本发明提出的一种硬件加速OpenCV库中图像处理函数的方法,在Xilinx提供的SDSOC平台基础之上,采用特殊的技术处理方式,将OpenCV库中的高强度计算功能函数移植到应用层,原来OpenCV库中需要进行硬件加速的图像处理函数的功能会挪到OpenCV应用代码中去实现。然后利用FPGA来进行加速;采用这种方式,在保持OpenCV原有库框架的不变的基础上,提高了运行速度,而且不需要硬件人员的参与,也不需要手动对软硬件进行集成,简化了开发流程,提高了开发效率。

附图说明

图1为OpenCV硬件加速流程。

具体实施方式

下面结合附图和具体实施例对本发明作进一步说明。

如图1所示,用户预先识别OpenCV库中运算量大,需要硬件加速的函数。

例如针对OpenCV库中的opencv-3.1.0\modules\calib3d\src\calibration.cpp文件中的reprojectImageTo3D函数进行硬件加速,具体实施步骤如下:

A、将reprojectImageTo3D函数内部的复杂运算逻辑功能,抽取出一个新的函数;

void sw_repro ject ImageTo3D(float*disparity,int rows,int cols,float q[][4],float minDisparity,float*outXYZ);

B、在该文件定义函数指针类型,其函数参数与新抽取函数的函数参数保持一致;

typedef void(*hiden_repro ject ImageTo3D)(float*disparity,int rows,int cols,float q[][4],float minDisparity,float*outXYZ);

C、定义一个该函数指针类型的静态全局变量;

static hiden_repro ject ImageTo3D hiden_instance;

D、定义一个可供应用程序调用的库函数,用来对静态全局变量赋值,并且函数参数类型与上述定义的函数指针类型保持一致;

E、修改库中需要进行硬件加速的图像处理函数,将其内部改成对静态全局变量函数指针的调用;

F、重新编译OpenCV库,生成对应的动态链接库,供应用程序调用;

G、在应用代码中定义硬件加速函数,调用动态链接库提供的赋值函数,将硬件函数加速作为参数传给该赋值函数;

H、最后在Xilinx SDSOC开发平台中,将硬件加速函数hw_repro ject ImageTo3D_impl改成由FPGA硬件逻辑来实现。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1