在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()等。
- 在Naoqi中使用OpenCV
- 在MFC中使用OpenCV
- 在Android中使用OpenCv
- 在python中使用OpenCV
- 在Origin中使用OpenCV
- 在MFC中使用OpenCV
- 在eclipse中使用opencv
- 在IOS中使用opencv
- 在wp8中使用opencv
- 在Xcode中使用OpenCV
- 在OpenCV中使用RANSAC
- 如何在Android中使用OpenCV
- 如何在Android中使用OpenCV
- 在Qt Creator中使用Opencv 2.3
- 如何在Android中使用OpenCV
- 如何在Android中使用OpenCV
- 在Visual Studio 2010中使用opencv
- 如何在Android中使用OpenCV
- 199. Binary Tree Right Side View
- Oracle审计sys操作记录到操作系统系统日志中
- 网络编程中套接字创建过程
- 游客好久了,切换到博客模式
- 过滤器
- 在Naoqi中使用OpenCV
- Servlet------文件的下载
- 学习Java开源框架前你应该了解的
- 计算机网络--网络层之IP地址与子网
- Commons IO 2.4
- js中数组申请的区别
- service与Thread的区别
- ACM_程序设计竞赛:贪心算法:字典最小序
- H264基础概念