OpenCV学习日记1

    xiaoxiao2026-04-24  4

    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_

    转载请注明原文地址: https://ju.6miu.com/read-1309181.html
    最新回复(0)