在Naoqi中使用OpenCV

来源:互联网 发布:神机妙算软件安装包 编辑:程序博客网 时间:2024/05/16 03:56

在Naoqi中使用OpenCV

1、  OpenCV(Open Computer Vision)是一个用C++实现的包含大量先进的视觉算法的开源库,其内容涵盖目标识别、视频分析、图像处理等各方面。

2、  OpenCV2.3.1

1.14版本的NAOqi SDK支持OpenCV 2.3.1的编译版本和交叉编译版本。相较OpenCV 2.1版本,修复了很多问题,做了大量优化,并在库的整体架构上做了很重要的重构。

        OpenCV2.3 几乎完全向下兼容OpenCV 2.1版本,因此,升级后应该不影响程序的运行。

        OpenCV2.3版本对整体架构做了全面的重构:

a、  将C接口API和C++接口API完全分离

b、  将分布模块分离成各个逻辑模组

3、  OpenCV的模组

OpenCV主要模组包括:

a、  core:包含基础的数据结构定义和函数

b、  highgui:与图形UI、交互相关的库,包括显示、载入和保存图片等

c、  imgproc:颜色转换,滤波等图像基础处理

d、  video:光流、背景提取

e、  calib3d:单应计算,基础矩阵计算,其他与相机标定和立体视觉相关的库

f、  features2D:特征检测,描述(FAST,SURF),匹配

g、  ml:机器学习(神经网络,SVM(支撑向量机),boosting,KNN等)

h、  flann:高效的聚类和数据检索

i、   objectdetection:目标检测:Cascade或HAAR分类器

每个模组都有其相对应的包含头文件

如:#include <opencv2/coe/core.hpp>

4、  API

目前C和C++的API已经做了明确的区分。如CvMat是C API,对应的C++ API是cv::Mat。除非开发纯C的项目,否则建议使用C++ 的API进行开发。更没必要进行混合开发。如果需要进行C API的开发,头文件的包含有一定的变化,如:

#include <opencv2/core/core_c.h>

        注意:不要混合包含C和C++两种头文件

       

        4.1IplImage 和cv::Mat

        IplImage*在2.3.1中已被cv::Mat取代,它们的数据结构基本上相同,但cv::Mat更泛型。所以所有函数含有IplImage *的参数在C++ API中均被cv::Mat取代。

        cv::Mat是一种智能指针,这意味着开发者不需要手动进行释放(虽然仍有释放函数)。cv::Mat像指针一样运作,例如:

                 cv::MatoldMat;

                 //dosome processing

                 cv::MatnewMat = oldMat;

        上面这行示例代码中,没有数据拷贝,所以,如果oldMat释放后,newMat也将被清空。如果需要进行数据拷贝,可以使用copyTo和clone两个函数。

        ROI(感兴趣区域)的处理方式如下:创建一个新的Matrix指向目标区域,也没有数据拷贝,如果需要拷贝,则通过拷贝函数将数据拷贝到目标Matrix。

        以下是IplImage和cv::Mat的部分属性的对应关系:

OpenCV 2.1

OpenCV 2.3

width

cols

height

rows

imageData

data

nChannels

channels()

 

4.2 CvSeq*和sdt::vector

OpenCV之前版本的存储结构,如CvSeq,CvMemstorage等,多少有一点反直觉,使用起来不是很方便。当前版本的C++ API中,CvSeq均被std::vector取代

 

4.3 从C转换到C++

例如:之前的cvSomeOpenCVMethod均有对应的C++ API可能只需要将CvSeq和std::vector,IplImage和cv::Mat进行替换,即可

 

5、  CMake依赖

NAOqi SDK中已经包含OpenCV 2.3,所以当需要使用OpenCV库时,只需要在脚本(CMakeList)中添加:

qi_use_lib(mylib OPENCV)即可

如要使用特定库,则所有的模组均以这种格式进行引用:OPENCV2_MODULENAME.

如highgui,core则在脚本中添加:qi_use_lib(mylib OPENCV2_CORE OPENCV2_HIGHGUI)

 

6、  Qi工具链编译OpenCV和系统编译OpenCV

NAOqi SDK已提供OpenCV 2.3.1版本库(版本可能会有区别),如果希望定制OpenCV版本或者功能库,则需要自己进行编译

安装最新版本OpenCV

a、清除老版本

如果没有安装之前的版本,跳过本步骤,直接进行编译安装

如果从源代码编译安装的

1)      到源代码的build目录

2)      执行命令(可能需要su权限):make uninstall

3)      如果从源代码编译安装,但又找不到源代码文件夹,则需要手动删除OpenCV库或者:

a)        下载与你安装版本号相符的OpenCV版本的源代码

b)        Build源代码,

c)        执行以下命令:

make

make install

make uninstall

如果从安装包安装的:从安装包进行uninstall

b、安装最新版本OpenCV

最佳方案是通过build源代码进行安装

1)  获取源代码

2)     解压

3)     进入解压的目录,创建build目录,并进入该目录

mkdir build

cd build

4)     使用CMake进行设置:

cmake ..

        此步骤将产生大量日志信息,具体内容参考:

        http://opencv.willowgarage.com/wiki/InstallGuide.

5)    build OpenCV

        make

6)     安装

make install

如上,则完成了OpenCV的整个安装过程

 

7、  从NAOqi SDK中移除OpenCV

一旦安装了通过系统进行编译安装了OpenCV,则需要从NAOqi  SDK中移除OpenCV。不需要删除CMake的配置文件

a、  从SDK的lib目录中删除所有OpenCV的库

b、  从SDK的include目录删除所有OpenCV的头文件

然后,通过qibuild清理整个SDK:

qibuild config[-c mytoolchain]

qibuild make[-cmytoolchain]

8、  交叉编译使用OpenCV

为保证编译程序可以在Nao上运行,代码中不能使用图形交互界面相关的函数,如windows,imshow,trackbars等

如果之前编译运行正常的代码在更新后发生错误,则可能存在的故障原因诊断如下:

a、CMake配置过程

配置过程中可能碰到一些问题,则可能原因是:

1)  已从NAOqi SDk中删除了OpenCV,但没有在系统中安装opencv

2)  在CMakeLists.txt中使用了错误的名字:检查是否OPENCV2_MODULENAME这样的结构,并确认ModuleName是否正确

b、构建与链接过程

如果产生编译错误,首先检查OpenCV的版本是否正确

如果出现“undefined referenceto”的错误,则需要检查是否在CMakeLists.txt文件中添加了正确的模组名称

如果是Linux 64位系统,如果返回指针相关的错误,可能原因是项目中使用OpenCV的C API相关的包含文件。如果确实需要包含OpenCV的C API相关的头文件,则需要在这些包含文件之前添加#include <cstddef.h>来修复这个问题,否则,建议去除相关包含文件。

C、运行时

在Ubuntu系统中,如果出现与NAOqi系统库相关的类似:“XXXfunction is not implemented”的错误提示,则很可能是代码中使用了GTK相关的函数,而你使用的OpenCV位交叉编译的,而不是系统编译的。比如:cv::namedWindow()或者cv::imshow()等。

0 0
原创粉丝点击