OpenCV 2 计算机视觉编程手册读书笔记1

矩阵创建

  Mat类是OpenCV中非常有用类,用来创建和操作多维矩阵。可以有很多方法构造它。

 // 构造函数
//! constructs 2D matrix of the specified size and type
// (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)
Mat(int rows, int cols, int type);
Mat(Size size, int type);
//! constucts 2D matrix and fills it with the specified value _s.
Mat(int rows, int cols, int type, const Scalar& s);
Mat(Size size, int type, const Scalar& s); // 感兴趣区域,部分区域,子区块,新的矩阵和m共同使用内存
//! creates a matrix header for a part of the bigger matrix
Mat(const Mat& m, const Range& rowRange, const Range& colRange=Range::all());
Mat(const Mat& m, const Rect& roi);
Mat(const Mat& m, const Range* ranges); // create()函数
Mat mat(, , CV_8UC3); //构造函数创建矩阵
M.create(, , CV_8UC2); //释放内存重新创建 // Matlab风格的创建方法
Mat zero = Mat::zeros(, , CV_8UC1);
Mat one = Mat::ones(, , CV32F);
Mat eye = Mat::eye(, , CV_64F);

  其中 type参数的值CV_8UC3,表示的是CV_8U类型,3通道,CV_8U即无符号8为数据。3通道相当于BGR通道。

图像读取

cv::imread( const string& filename, int flags);

读取指定的图片,flags可以有以下的值:

enum
{
/* 8bit, color or not */
CV_LOAD_IMAGE_UNCHANGED =-,
/* 8bit, gray */
CV_LOAD_IMAGE_GRAYSCALE =,
/* ?, color */
CV_LOAD_IMAGE_COLOR =,
/* any depth, ? */
CV_LOAD_IMAGE_ANYDEPTH =,
/* ?, any color */
CV_LOAD_IMAGE_ANYCOLOR =
};

图像显示

 // 先命名一个窗口,再使用
namedWindow( "output", CV_WINDOW_AUTOSIZE );
imshow("input", img);

  窗口可以有以下Type:  

 enum
{
//These 3 flags are used by cvSet/GetWindowProperty
CV_WND_PROP_FULLSCREEN = , //to change/get window's fullscreen property
CV_WND_PROP_AUTOSIZE = , //to change/get window's autosize property
CV_WND_PROP_ASPECTRATIO= , //to change/get window's aspectratio property
CV_WND_PROP_OPENGL = , //to change/get window's opengl support //These 2 flags are used by cvNamedWindow and cvSet/GetWindowProperty
CV_WINDOW_NORMAL = 0x00000000, //the user can resize the window (no constraint) / also use to switch a fullscreen window to a normal size
CV_WINDOW_AUTOSIZE = 0x00000001, //the user cannot resize the window, the size is constrainted by the image displayed
CV_WINDOW_OPENGL = 0x00001000, //window with opengl support //Those flags are only for Qt
CV_GUI_EXPANDED = 0x00000000, //status bar and tool bar
CV_GUI_NORMAL = 0x00000010, //old fashious way //These 3 flags are used by cvNamedWindow and cvSet/GetWindowProperty
CV_WINDOW_FULLSCREEN = ,//change the window to fullscreen
CV_WINDOW_FREERATIO = 0x00000100,//the image expends as much as it can (no ratio constraint)
CV_WINDOW_KEEPRATIO = 0x00000000//the ration image is respected.
};

图像存储

 cv::imrwite("output.jpg", imgOut);

图像像素操作

  at函数

 void salt(cv::Mat &image, int n)
{
for(int k =; k<n; ++k)
{
int i=rand()%image.cols;
int j=rand()%image.rows;
if(image.channels() == ) // gray image
{
image.at<uchar>(j, i) = ;
}
else if(image.channels() == ) // color image
{
image.at<cv::Vec3b>(j, i)[] = ;
image.at<cv::Vec3b>(j, i)[] = ;
image.at<cv::Vec3b>(j, i)[] = ;
}
}
}

  其中Vec3b的定义为:typedef Vec<uchar, 3> Vec3b。上述代码是在一个图片上随机产生盐点。

  迭代器

 cv::Mat Iterator_<cv::Vec3b> it;
// 定义在Mat_内部的迭代器
cv::Mat_<cv::Vec3b>::iterator it; // 迭代器使用
void colorReduce(cv::Mat &image, int div=)
{
// 得到初始位置的迭代器
cv::Mat_<cv::Vec3b>::iterator it = image.begin<cv::Vec3b>();
// 得到种植位置的迭代器
cv::Mat_<cv::Vec3b>::iterator itend = image.edn<cv::Vec3b>();
// 遍历所有像素
for(; it!=itend; ++it)
{
// 处理每个像素
(*it)[] = (*it)[]/div*div+div/;
(*it)[] = (*it)[]/div*div+div/;
(*it)[] = (*it)[]/div*div+div/;
}
}

  指针操作

// 得到image图像的第index行的首地址
image.ptr<uchar>(index);

图像算术运算

  图像的算术运算可以有加减乘除,可以对图片有亮度有影响,具体的后续再了解。

图像感兴趣区域

  图像感兴趣区域指的是,对一个图片的部分区域感兴趣,则可以只操作感兴趣的部分区域,也即子区域。

OpenCV学习(一)基础篇的更多相关文章

  1. 一步步学习javascript基础篇(0):开篇索引

    索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...

  2. 一步步学习javascript基础篇(3):Object、Function等引用类型

    我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...

  3. Python3学习(1)-基础篇

    Python3学习(1)-基础篇 Python3学习(2)-中级篇 Python3学习(3)-高级篇 安装(MAC) 直接运行: brew install python3 输入:python3 --v ...

  4. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  5. Python学习笔记——基础篇【第一周】——变量与赋值、用户交互、条件判断、循环控制、数据类型、文本操作

    目录 Python第一周笔记 1.学习Python目的 2.Python简史介绍 3.Python3特性 4.Hello World程序 5.变量与赋值 6.用户交互 7.条件判断与缩进 8.循环控制 ...

  6. opencv学习之基础

    前段时间一直在钻研深度学习中的卷积神经网络,其中的预处理环节可以说非常关键,主要就是对图片和视频进行处理.而图像处理就涉及到图形学和底层技术细节,这是一个比较精深和专业的领域,假设我们要从头开始做起, ...

  7. java学习笔记-基础篇

    Java基础篇 1—12 常识 13 this关键字 14参数传递 16 继承 17 访问权限 28—31异常 1—12 常识 1.文件夹以列表展示,显示扩展名,在地址栏显示全路径 2.javac编译 ...

  8. Java学习路线-基础篇!

    下面以黑马程序员Java学院的学习路线为例,进行一次史无前例的剖析,我会采取连载的形式,细致的讲解零基础的人怎么学习Java.先看下Java在基础阶段的知识点路线图. 内容多吗?不要被吓到了,知识点剖 ...

  9. 一步步学习javascript基础篇(8):细说事件

    终于学到事件了,不知道为何听到“事件”就有一种莫名的兴奋.可能是之前的那些知识点过于枯燥无味吧,说起事件感觉顿时高大上了.今天我们就来好好分析下这个高大上的东西. 可以说,如果没有事件我们的页面就只能 ...

  10. 一步步学习javascript基础篇(5):面向对象设计之对象继承(原型链继承)

    上一篇介绍了对象创建的几种基本方式,今天我们看分析下对象的继承. 一.原型链继承 1.通过设置prototype指向“父类”的实例来实现继承. function Obj1() { this.name1 ...

随机推荐

  1. [转载]get、post异同

    1. get是从服务器上获取数据,post是向服务器传送数据. 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过 ...

  2. js中获取当天的时间的年月日

    var d=new Date() var day=d.getDate() var month=d.getMonth() + 1 var year=d.getFullYear() document.wr ...

  3. java框架注意

    struts2 数据类型不匹配时会return "input" <result name="input">/WEB-INF/index.jsp< ...

  4. Python关键点笔记之使用 pyenv 管理多个 Python 版本依赖环境

    0x00 背景 从接触Python以来,一直都是采用virtualenv和virtualenvwrapper来管理不同项目的依赖环境,通过workon.mkvirtualenv等命令进行虚拟环境切换, ...

  5. 【Alpha】Scrum Meeting 6

    目录 前言 任务分配 燃尽图 会议照片 签入记录 困难 前言 第6次会议在4月10日22:00由PM在一公寓三楼召开. 交流确认了任务进度,对下一阶段任务进行分配.时长15min. 任务分配 姓名 当 ...

  6. 事件Event实现消费者模型

    import timeimport randomfrom multiprocessing import Process,Queue def consumer(q,name): while True: ...

  7. JAVA基础知识笔记

    1.类只能用Public修饰,不能使用protected.private修饰.也可以不加修饰符,称做友好类. 2.类的实体元素包含成员变量和方法的定义,成员变量分为实例变量和类变量(static修饰的 ...

  8. 查漏补缺之——Java多线程

    复习面试题中遇到锁的内容当时大一学习的时候感觉懵懂,现在重新复习一下. 1.1多线程 1.1.1线程 1.什么是线程 线程是程序执行的一条路径,一个进程中包含多条进程 2.并行与并发 并行是两个任务同 ...

  9. ES6 新加的类型Symbol()

    Symbol()如果一个对象中的键已经存在,但目前我们目前不知道这个键是存在的,然后我们去给这个键赋值,Symbol()就不会改变这个键对应的值

  10. input type="tel" 输入框显示密文

    为了在移动端实现密码输入框且调起的键盘为数字键盘,可以用-webkit-text-security:disc;text-security:disc;属性来实现. 语法: text-security: ...