在Naoqi中使用OpenCV
2016-04-21 15:50
155 查看
在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的部分属性的对应关系:
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()等。
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() |
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()等。
相关文章推荐
- 编写Linux脚本
- 一些常用的linux命令
- OpenCV中CV_IS_MAT_CONT(src->type & dst->type) 的含义!
- linux内核调试工具Kprobes
- 在CentOS系统上从零开始搭建WordPress博客的全流程记录
- Nginx 下配置SSL证书的方法
- nginx(Window下安装 & 配置文件参数说明 & 实例)
- AVAYA AEP运维之日志收集总结
- Tomcat使用数据源(JNDI/直接使用)
- 正则化方法/防止过拟合提高泛化能力的方法:L1和L2 regularization、数据集扩增、dropout
- java转换json需要导入的jar包,org/apache/commons/lang/exception/NestableRuntimeException
- 各种学习资料查阅网站地址
- tomcat配置文件web.xml与server.xml解析--重要
- Hadoop2.6.0配置参数查看小工具
- LINUX 下安装 jdk 问题(please use alien to install rpm packages on Debian )
- Servlet实现数据库查询(MyEclipse10,Tomcat7.0,JDK1.7,)——Java Web练习(三)
- tomcat6的编译和导入myeclipse
- ldd(linux设备驱动程序)scull驱动
- 阿里云 linux CentOS 64bit 安装jdk
- 常用linux操作history列表