OpenVX支持树莓派联合开发
Khronos集团和树莓派共同致力于OpenVX的开源实现™11.3,通过了树莓派的一致性。通过一致性配置文件,开源实现了树莓派上OpenVX 1.3中指定的视觉、增强视觉和神经网络。
当Khronos标准在目标系统上可用时,应用程序开发人员可以始终自由使用这些标准。
OpenVX实现了性能和功率优化的计算机视觉处理,在人脸、身体和手势跟踪、智能视频监控、高级驾驶员辅助系统(ADAS)、物体和场景重建、增强现实、视觉检查、机器人等嵌入式和实时用例中尤为重要。开发人员可以使用这种强大的API,在所有符合要求的硬件上,开发可移植程序。
OpenVX支持符合要求的硬件设备开发,并且可移植性强,如图1-47所示。
图1-47 OpenVX支持符合要求的硬件设备开发,并且可移植性强
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;
}
5.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);
6.小结
OpenVX提供了一种便于开发人员利用硬件加速功能,实现计算机视觉处理的标准API,它可以实现图像滤波、图像分割、特征提取等功能。使用OpenVX进行计算机视觉处理非常简单,可以使开发人员更加专注于算法的开发,而无需太关注底层的实现细节。
OpenVX可以认为是OpenCV的嵌入式版本(计算机视觉和人工智能),OpenVX提供一些图像处理的标准的API,系统第三方销售方,可以用硬件来实现一些图像处理功能,OpenVX比OpenCV效率更高,而OpenCV则偏向于用软件的方式来实现这些功能。
在OpenVX当中,有一个关键词叫做内核,这里的内核并不是指操作系统的内核,而是指OpenVX中的一种功能,比如,对一帧图片进行高通滤波处理,就是openVX的一个功能,在OpenVX里称为一个用户内核。既然内核是一种提供给用户使用的功能,那么这个功能函数一般支持参数传递,通过参数的不同来改变内核的运行结果(比如传入的图片就算一个参数),在OpenVX中,把参数定义初始化后的内核称为节点。因此,节点就是内核的一个实例化,即拥有指定参数的内核。在CNN中,OpenVX的节点就是一个层,而OpenVX的运行是基于节点来运行的,所有的节点会被链接到图中,最后由graph统一运行。OpenVX神经网络开发示例,如图1-48所示。
图1-48 OpenVX神经网络开发示例
既然存在用户内核(这个功能运行在当前CPU上),TI在openVX上增加了远程内核,即这个内核函数是运行在其他CPU上面的,这样做可以让多个CPU并行运算,提升运行效率,例如,将不同功能分发给擅长该功能的CPU运行,可以事半功倍。