1. OpenCV安装
OpenCV是一个开源的跨平台的计算机视觉类库,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV的应用包括:人机互动,物体识别,图像分割,人脸识别,动作识别,运动跟踪,机器人,运动分析,机器视觉,结构分析,汽车安全驾驶等领域。自己也坚信计算机视觉会成为AR/VR,机器人,无人机,自动驾驶等的重要组成部分。
[1]安装依赖库
sudo apt-get install libgtk2.0-dev pkg-config sudo apt-get install build-essential sudo apt-get install cmake sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev[2]编译OpenCV
将OpenCV放到任意目录,然后unzip opencv-2.4.13.zip。创建编译目录,然后编译和安装,如下所示:
cd opencv-2.4.13 mkdir release cd release cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. make sudo make install[3]OpenCV参数设置
在/etc/ld.so.conf.d/opencv.conf文件中加入一行:/usr/local/lib,然后执行命令sudo ldconfig。在/etc/bash.bashrc文件中添加内容,如下所示:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH说明:至此OpenCV安装配置全部完成。
[4]一个人脸检测的例子
进入目录opencv-2.4.13/samples/c,然后执行命令./build_all.sh。如下所示:
./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 lena.jpg输出结果,如下所示:
2. Nsight Eclipse Edition开发OpenCV应用程序
主要是配置Cross G++ Compiler中的Includes和Cross G++ Linker中的Libraries [详细配置请参考[2]]。给出一个测试例子,如下所示:
#include <string> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main() { string imagename = "/root/CUDAProgram/TestOpenCV/src/test.png"; Mat img = imread(imagename); if(img.empty()) { cout<<"read failed!"; return -1; } namedWindow("image", 1); imshow("image", img); waitKey(); return 0; }解析:
[1]Mat是OpenCV最基本的数据结构,它主要包含2部分:Header和Pointer。Header中主要包含矩阵的大小,存储方式,存储地址等信息;而Pointer中存储指向像素值的指针。
[2]waitKey(delay=0):delay参数表示等待delay毫秒,如果在此期间有按键按下,那么立即结束并返回按键的ASCII码,否则返回-1。如果delay≤0,那么无限等待下去,直到有按键按下。
3. OpenCV数据结构
OpenCV主要分为5个模块,CV模块包含基本的图像处理函数和高级的计算机视觉算法;ML是机器学习库,包含一些基于统计的分类和聚类工具;HighGUI包含图像和视觉输入/输出的函数;CXCore包含OpenCV的一些基本数据结构和相关函数;CxAux模块一般存放一些即将被淘汰的算法和函数[比如,基于嵌入式隐马尔可夫模型的人脸识别算法等],同时还有一些新出现的实验性的算法和函数 [比如,前景和背景的分割等]。
[1]OpenCV基本数据类型
解析:
CvPoint:2D point with integer coordinatesCvPoint2D32f:2D point with floating-point coordinatesCvPoint3D32f:3D point with floating-point coordinatesCvPoint2D64f:2D point with double precision floating-point coordinatesCvPoint3D64f:3D point with double precision floating-point coordinatesCvSize:pixel-accurate size of a rectangleCvSize2D32f:sub-pixel accurate size of a rectangleCvRect:offset and size of a rectangleCvScalar:A container for 1-,2-,3- or 4-tuples of numbersCvTermCriteria:Termination criteria for iterative algorithmsCvMat:Multi-channel matrixCvMatND:Multi-dimensional dense multi-channel arrayCvSparseMat:Multi-dimensional sparse multi-channel arrayIplImage:IPL image headerCvArr:Arbitrary array说明:关于OpenCV基本数据类型的结构体定义请参考$OpenCV\cxcore\include\cxtypes.h。
[2]CvArr数据结构
解析:typedef void CvArr;
[3]CvMat数据结构
解析:
typedef struct CvMat { int type; // 类型 int step; // 用字节表示行数据长度*/ int* refcount; // 内部访问 union { uchar* ptr; short* s; int* i; float* fl; double* db; } data; // 数据指针 union { int rows; int height; // 高度 }; union { int cols; int width; // 宽度 }; } CvMat; // 矩阵结构头[4]IplImage数据结构
解析:
IplImage是我们用来为图像进行编码的基本结构,这些图像可以是灰度、彩色、4通道的等,其中每个通道可以包含任意的整数或浮点数。因此,IplImage结构体是整个OpenCV函数库的基础。
typedef struct _IplImage { int nSize; // IplImage大小 int ID; // 版本 int nChannels; // 大多数OpenCV函数支持1,2,3或4个通道 int alphaChannel; // 被OpenCV忽略 int depth;//像素的位深度,支持:IPL_DEPTH_8U,IPL_DEPTH_8S,IPL_DEPTH_16U,IPL_DEPTH_16S,IPL_DEPTH_32S,IPL_DEPTH_32F和IPL_DEPTH_64F char colorModel[4]; // 被OpenCV忽略 char channelSeq[4]; // 被OpenCV忽略 int dataOrder; // 0:交叉存取颜色通道;1:分开的颜色通道。cvCreateImage只可以创建交叉存取图像 int origin; // 图像原点位置:0表示顶-左结构,1表示底-左结构 int align; // 图像行排列方式(4或8)。被OpenCV忽略,使用widthStep代替 int width; // 图像宽像素数 int height; // 图像高像素数 struct _IplROI *roi; // 图像感兴趣区域,当该值非空时,只对该区域进行处理 struct _IplImage *maskROI; // 在OpenCV中必须为NULL void *imageId; // 在OpenCV中必须为NULL struct _IplTileInfo *tileInfo; // 在OpenCV中必须为NULL int imageSize; // 图像数据大小(在交叉存取格式下ImageSize = image->height*image->widthStep),单位字节 char *imageData; // 指向排列的图像数据 int widthStep; // 排列的图像行大小,以字节为单位 int BorderMode[4]; // 边际结束模式,被OpenCV忽略 int BorderConst[4]; // 边际结束模式,被OpenCV忽略 char *imageDataOrigin; // 指针指向一个不同的图像数据结构(不是必须排列的),主要是为了纠正图像内存分配准备的 } IplImage;[5]Mat数据结构
解析:
Mat是一个多维的密集数据数组,可以用来处理向量和矩阵、图像、直方图等常见的多维数据。与CvMat和IplImage相比,Mat有更强的矩阵运算能力。因此,将CvMat与IplImage转化为Mat将大大减少计算时间。Mat常用的3个方法,如下所示:
Mat mat = imread(const String* filename); // 读取图像 imshow(const string frameName, InputArray mat); // 显示图像 imwrite(const string& filename, InputArray img); // 存储图像假设Mat类型的imgMat图像数据存在,那么IplImage pImg = IplImage(imgMat);[Mat -> IplImage]和CvMat cvMat = imgMat;[Mat -> CvMat]。
参考文献:
[1] opencv在ubuntu下的安装:http://www.cnblogs.com/jeakon/archive/2013/05/08/3066469.html
[2] Using OpenCV with Eclipse (plugin CDT):http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/introduction/linux_eclipse/linux_eclipse.html
[3] Welcome to OpenCV-Python Tutorials’s documentation!:http://opencv-python-tutroals.readthedocs.io/en/latest/
[4] OpenCV中文网站:http://wiki.opencv.org.cn/index.php/%E9%A6%96%E9%A1%B5
[5] OpenCV 3.0.0-dev documentation:http://docs.opencv.org/3.0-last-rst/
[6] IplImage,CvMat,Mat的关系:http://www.cnblogs.com/summerRQ/articles/2406109.html
[7] CXCORE Reference Manual:http://opencv.jp/opencv-1.0.0_org/docs/ref/opencvref_cxcore.htm#cxcore_basic_structures
[8] IplImage:http://baike.baidu.com/link?url=vGa0nWnXuJXpR-JHWyS2fdg9OUAkyd7eDY7XRu3XwxeZq65g7AM7_kEkbhVT78Wp0TVCAljWnmRvvama_TZzo_
