OpenCV学习日记1
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 coordinates
- CvPoint2D32f:2D point with floating-point coordinates
- CvPoint3D32f:3D point with floating-point coordinates
- CvPoint2D64f:2D point with double precision floating-point coordinates
- CvPoint3D64f:3D point with double precision floating-point coordinates
- CvSize:pixel-accurate size of a rectangle
- CvSize2D32f:sub-pixel accurate size of a rectangle
- CvRect:offset and size of a rectangle
- CvScalar:A container for 1-,2-,3- or 4-tuples of numbers
- CvTermCriteria:Termination criteria for iterative algorithms
- CvMat:Multi-channel matrix
- CvMatND:Multi-dimensional dense multi-channel array
- CvSparseMat:Multi-dimensional sparse multi-channel array
- IplImage:IPL image header
- CvArr: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_64Fchar 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中必须为NULLvoid *imageId; // 在OpenCV中必须为NULLstruct _IplTileInfo *tileInfo; // 在OpenCV中必须为NULLint 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_
OpenCV学习日记1相关推荐
- opencv学习日记——娜扎小姐姐与猫咪的图像融合,超美哈哈哈
opencv学习日记--图像的比较和融合,超美哈哈哈 图在后边哦,不看代码也要看看图,很酷,opencv绝了!!! #include<iostream> #include<openc ...
- OpenCV学习日记(2)
绪言 图像基本要素简介 1.灰度色彩空间 2.BGR色彩空间 3.HSV色彩空间 数学知识简介 图像处理中的数学 连续傅里叶变换 离散时间傅里叶变换 离散傅里叶变换 傅里叶逆变换 卷积 滤波器 简介 ...
- opencv学习日记——CV_8UC1 含义
CV_8UC1 含义 预定义: CV_<bit_depth>(S|U|F)C<number_of_channels> 1–bit_depth-比特数-代表8bite,16bit ...
- caffe学习日记--lesson5: VS下新建工程,探究Blob
caffe学习日记--lesson5: VS下新建工程,探究Blob 在VS2013下新建工程,探究caffe的数据结构Blob,并使用.熟悉caffe 1.新建空白的控制台应用程序,添加main.c ...
- OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法...
函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...
- opencv学习笔记(二):基于肤色的人手检测
opencv学习笔记(二):基于肤色的人手检测 原文:http://blog.csdn.net/wzmsltw/article/details/50849810 先写了人手的检测程序,下一步基于检测程 ...
- Python+OpenCV学习(17)---摄像机标定
Python+OpenCV学习(17)---摄像机标定 原文:http://blog.csdn.net/firemicrocosm/article/details/48594897 利用python学 ...
- OpenCV学习之六: 使用方向梯度直方图估计图像旋转角度
OpenCV学习之六: 使用方向梯度直方图估计图像旋转角度 原文:http://blog.csdn.net/zhjm07054115/article/details/26964275 下面的代码通过计 ...
- python做直方图-python OpenCV学习笔记实现二维直方图
本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d ...
最新文章
- 谷歌浏览器linux版_Chrome apps 要被谷歌干掉了
- Android多模块覆盖率,Android代码覆盖率初探—问题已解决!
- 从零开始的全栈工程师——html篇1.2
- 内核中的UDP socket流程(7)——udp_sendmsg
- 慕课学习--DNS的作用
- 华晨中华v3车质量怎么样_宝马发动机加持,销量仅个位数?这些车有点惨
- SVN—怎么删除 SVN 上已有的URl
- 店宝宝:京东重新进军社区团购
- linux 帝国cms 刷新,帝国cms怎么自动刷新网站首页?(帝国CMS自动刷新首页的方法)...
- 从“大恐怖”展望AI未来,未来人类会好吗?
- 自动修改hosts文件
- safari支持Ajax同步请求吗,在同步“Ajax”请求之前强制在Webkit(Safari和Chrome)中重绘UI...
- Inversion Lemma
- Xmanager Enterprise 5破解版
- Nmap命令详解(全)
- Android onKeyDown监听返回键无效
- 如何免费获取县级气象数据?
- 计算机考研英语自我介绍范文,考研复试英语自我介绍范文
- oracle 提取手机号码
- Python官方教程.pdf