OpenVX原理与技术杂谈
OpenVX原理与技术杂谈
OpenCV和OpenVX有什么联系和区别
联系和区别是:OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库。OpenVX 实现了跨平台加速处理,OpenVX在嵌入式和实时性系统中可以更好地发挥它的优势,在某些场合配合OpenCV的强大功能可以实现更好的效果。OpenVX和OpenCV并不冲突,他们可以说是互补的。
OpenCV
OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。
OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#、Ch、Ruby的支持。
OpenVX
OpenVX 实现了跨平台加速处理,OpenVX在嵌入式和实时性系统中可以更好地发挥它的优势,在某些场合配合OpenCV的强大功能可以实现更好的效果。OpenVX和OpenCV并不冲突,他们可以说是互补的。OpenVX 目的方便不同的硬件平台,实现相同的接口。就像一个骨架,包含一些头文件声明了很多宏、枚举、变量类型、函数等等。OpenVX实现了计算机视觉处理中性能和能耗方面的优化,特别是嵌入式和实时应用案例中起到重要作用,例如面部、身体和动作跟踪,智能视频监控,高级驾驶协助系统(ADAS),物体和场景重建,增强现实,视觉检测,机器⼈学等等。OpenVX定义了比例如OpenCL™那些计算框架更高水平的执行抽象和内存模型,为在更多架构上的执行创新和高效执行带来重要意义,同时确保这是和以往一致的视觉加速API,完全实现应用可移植性。
OpenCV的优势
计算机视觉市场巨大而且持续增长,且这方面没有标准API,如今的计算机视觉软件大概有以下三种:
1、研究代码(慢,不稳定,独立并与其他库不兼容)
2、耗费很高的商业化工具(比如Halcon, MATLAB+Simulink)
3、依赖硬件的一些特别的解决方案(比如视频监控,制造控制系统,医疗设备)这是如今的现状,而标准的API将简化计算机视觉程序和解决方案的开发,OpenCV致力于成为这样的标准API。
OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(Integrated Performance Primitives)得到更快的处理速度。图1为OpenCV与当前其他主流视觉函数库的性能比较。
OpenVX在计算机视觉中的应用
一、简介
OpenVX是一个图像和视觉处理库,它是由Khronos Group维护的标准API。OpenVX的目的是提供高性能的硬件加速计算机视觉功能。它提供了一种用于构建和处理图像和视频流的标准界面,使开发人员可以更加容易地利用硬件加速功能。
二、OpenVX的核心概念
OpenVX的核心概念是图和图算子。一个图是由节点和边组成的,每个节点表示一个算法,边表示节点之间的依赖关系。另外,OpenVX还定义了一些图算子,用于实现各种功能。
用于计算机视觉的OpenVX
OpenVX™是由Khronos集团开发的用于计算机视觉应用程序跨平台加速的开放、无版税的API标准。Khronos集团是一个开放的行业联盟,由150多家领先的硬件和软件公司组成,为3D图形、增强和虚拟现实、视觉和机器学习创建先进的免版税加速标准。Khronos标准包括Vulkan®、OpenCL™,SSYCL™,OOpenVX™,NNNEF™,以及许多其他方面。
现在添加树莓派
Khronos集团和Raspberry Pi共同致力于OpenVX的开源实现™11.3,通过了Raspberry Pi的一致性。开源实现通过了Raspberry Pi上OpenVX 1.3中指定的Vision、Enhanced Vision和Neural Net一致性配置文件。
当Khronos标准在目标系统上可用时,应用程序开发人员可以始终自由使用这些标准。为了使公司能够测试其产品的一致性,Khronos h。
OpenVX实现了性能和功率优化的计算机视觉处理,在人脸、身体和手势跟踪、智能视频监控、高级驾驶员辅助系统(ADAS)、物体和场景重建、增强现实、视觉检查、机器人等嵌入式和实时用例中尤为重要。开发人员可以利用在他们的应用程序中使用这种强大的API,并知道该应用程序在所有符合要求的硬件上都是可移植的。
三、OpenVX的基本操作
1、创建一个OpenVX上下文
vx_context context = vxCreateContext();
if (context == NULL) {
printf("无法创建OpenVX上下文!\n");
return -1;
}
2、创建一个输入图像
vx_image input_image = vxCreateImage(context, width, height, VX_DF_IMAGE_U8);
if (input_image == NULL) {
printf("创建输入图像失败!\n");
vxReleaseContext(&context);
return -1;
}
3、创建一个输出图像
vx_image output_image = vxCreateImage(context, width, height, VX_DF_IMAGE_U8);
if (output_image == NULL) {
printf("创建输出图像失败!\n");
vxReleaseImage(&input_image);
vxReleaseContext(&context);
return -1;
}
4、创建一个算子
vx_threshold threshold = vxCreateThreshold(context, VX_THRESHOLD_TYPE_BINARY, VX_TYPE_UINT8);
if (threshold == NULL) {
printf("创建算子失败!\n");
vxReleaseImage(&output_image);
vxReleaseImage(&input_image);
vxReleaseContext(&context);
return -1;
}
5、将输入图像和输出图像绑定到算子上
vx_status status = vxSetParameterByIndex(threshold, 0, (vx_reference)input_image);
if (status != VX_SUCCESS) {
printf("绑定输入图像失败!\n");
vxReleaseThreshold(&threshold);
vxReleaseImage(&output_image);
vxReleaseImage(&input_image);
vxReleaseContext(&context);
return -1;
}
status = vxSetParameterByIndex(threshold, 1, (vx_reference)output_image);
if (status != VX_SUCCESS) {
printf("绑定输出图像失败!\n");
vxReleaseThreshold(&threshold);
vxReleaseImage(&output_image);
vxReleaseImage(&input_image);
vxReleaseContext(&context);
return -1;
}
6、执行算子
status = vxProcessGraph(graph);
if (status != VX_SUCCESS) {
printf("执行算子失败!\n");
vxReleaseThreshold(&threshold);
vxReleaseImage(&output_image);
vxReleaseImage(&input_image);
vxReleaseContext(&context);
return -1;
}
四、OpenVX在计算机视觉中的应用
1、图像滤波
图像滤波是一种常见的计算机视觉处理方法,它可以使图像更加清晰、更加自然。使用OpenVX实现图像滤波功能非常简单,只需要使用vxGaussian3x3算子即可:
vx_image input_image = vxCreateImage(context, width, height, VX_DF_IMAGE_U8);
vx_image output_image = vxCreateImage(context, width, height, VX_DF_IMAGE_U8);
vxGaussian3x3(context, input_image, output_image);
2、图像分割
图像分割是一种常见的计算机视觉处理方法,它可以将图像分成若干个区域,从而便于对图像进行进一步处理。使用OpenVX实现图像分割功能也非常简单,只需要使用vxMeanShift算子即可:
vx_image input_image = vxCreateImage(context, width, height, VX_DF_IMAGE_U8);
vx_image output_image = vxCreateImage(context, width, height, VX_DF_IMAGE_U8);
vxMeanShift(context, input_image, spatial_window, range_window, output_image);
3、特征提取
特征提取是一种常见的计算机视觉处理方法,它可以从图像中提取出一些重要的特征,从而便于进行更高级的计算机视觉处理。使用OpenVX实现特征提取功能也非常简单,只需要使用vxHarrisCorners算子即可:
vx_image input_image = vxCreateImage(context, width, height, VX_DF_IMAGE_U8);
vx_array corners = vxCreateArray(context, VX_TYPE_KEYPOINT, max_corners);
vxHarrisCorners(context, input_image, strength_thresh, min_distance, sensitivity, gradient_size, block_size, corners);
五、小结
OpenVX提供了一种便于开发人员利用硬件加速功能实现计算机视觉处理的标准API,它可以实现图像滤波、图像分割、特征提取等功能。使用OpenVX进行计算机视觉处理非常简单,可以使开发人员更加专注于算法的开发,而无需太关注底层的实现细节。
嵌入式OpenVX-计算机视觉库
OpenVX我觉得可以认为是OpenCV的嵌入式版本(计算机视觉和人工智能),OpenVX提供一些图像处理的标准的API,系统第三方Vendor可以用硬件来实现一些图像处理功能,效率更高,而OpenCV则偏向于用Software的方式来实现这一些定义的功能(本章只是简单做一个记录,并不详细说实现)。
在OpenVX当中,有一个关键词叫做kernel,这里的kernel并不是指操作系统的kernel,而是指OpenVX中的一种功能,比如对一个图片进行高通滤波的功能就是openVX的一个功能,这在OpenVX里面叫做一个user kernel。既然kernel是一种提供给用户使用的功能,那么这个功能函数一般支持传参,通过参数的不同来改变kernel的运行结果(比如传入的图片就算一个参数),在OpenVX当中,把参数定义初始化好后的kenrel叫做node, 因此,node就是kernel的一个实例化即拥有指定参数的kernel。在CNN中,OpenVX的node就是一个layer层,而OpenVX的运行是基于node来运行的,所有的node会被链接到图(graph)中,最后由graph统一运行。运行例子如下(具体编程参考后面的链接):
既然存在user kernel(这个功能运行在当前CPU上),TI在openVX的基础上增加了remote kernel即这个Kernel函数是运行在其他CPU上面的,这样做可以让多个CPU并行运算,提升运行效率,比如将不同功能分发给擅长该功能的CPU运行,可以事半功倍(这里就简单提一下,不详细说具体实现)。
TI的多核并行运算TIOpenVX数据逻辑如下(远程CPU之间通信是通过共享内存和rpmsg实现,下图是一个DSP+ARM流程图):
TI修改后的TiOpenVX代码初始化逻辑框架如下: