OpenCV学习(一)基础篇
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学习(一)基础篇的更多相关文章
- 一步步学习javascript基础篇(0):开篇索引
索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...
- 一步步学习javascript基础篇(3):Object、Function等引用类型
我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...
- Python3学习(1)-基础篇
Python3学习(1)-基础篇 Python3学习(2)-中级篇 Python3学习(3)-高级篇 安装(MAC) 直接运行: brew install python3 输入:python3 --v ...
- Python学习笔记基础篇——总览
Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...
- Python学习笔记——基础篇【第一周】——变量与赋值、用户交互、条件判断、循环控制、数据类型、文本操作
目录 Python第一周笔记 1.学习Python目的 2.Python简史介绍 3.Python3特性 4.Hello World程序 5.变量与赋值 6.用户交互 7.条件判断与缩进 8.循环控制 ...
- opencv学习之基础
前段时间一直在钻研深度学习中的卷积神经网络,其中的预处理环节可以说非常关键,主要就是对图片和视频进行处理.而图像处理就涉及到图形学和底层技术细节,这是一个比较精深和专业的领域,假设我们要从头开始做起, ...
- java学习笔记-基础篇
Java基础篇 1—12 常识 13 this关键字 14参数传递 16 继承 17 访问权限 28—31异常 1—12 常识 1.文件夹以列表展示,显示扩展名,在地址栏显示全路径 2.javac编译 ...
- Java学习路线-基础篇!
下面以黑马程序员Java学院的学习路线为例,进行一次史无前例的剖析,我会采取连载的形式,细致的讲解零基础的人怎么学习Java.先看下Java在基础阶段的知识点路线图. 内容多吗?不要被吓到了,知识点剖 ...
- 一步步学习javascript基础篇(8):细说事件
终于学到事件了,不知道为何听到“事件”就有一种莫名的兴奋.可能是之前的那些知识点过于枯燥无味吧,说起事件感觉顿时高大上了.今天我们就来好好分析下这个高大上的东西. 可以说,如果没有事件我们的页面就只能 ...
- 一步步学习javascript基础篇(5):面向对象设计之对象继承(原型链继承)
上一篇介绍了对象创建的几种基本方式,今天我们看分析下对象的继承. 一.原型链继承 1.通过设置prototype指向“父类”的实例来实现继承. function Obj1() { this.name1 ...
随机推荐
- [转载]get、post异同
1. get是从服务器上获取数据,post是向服务器传送数据. 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过 ...
- js中获取当天的时间的年月日
var d=new Date() var day=d.getDate() var month=d.getMonth() + 1 var year=d.getFullYear() document.wr ...
- java框架注意
struts2 数据类型不匹配时会return "input" <result name="input">/WEB-INF/index.jsp< ...
- Python关键点笔记之使用 pyenv 管理多个 Python 版本依赖环境
0x00 背景 从接触Python以来,一直都是采用virtualenv和virtualenvwrapper来管理不同项目的依赖环境,通过workon.mkvirtualenv等命令进行虚拟环境切换, ...
- 【Alpha】Scrum Meeting 6
目录 前言 任务分配 燃尽图 会议照片 签入记录 困难 前言 第6次会议在4月10日22:00由PM在一公寓三楼召开. 交流确认了任务进度,对下一阶段任务进行分配.时长15min. 任务分配 姓名 当 ...
- 事件Event实现消费者模型
import timeimport randomfrom multiprocessing import Process,Queue def consumer(q,name): while True: ...
- JAVA基础知识笔记
1.类只能用Public修饰,不能使用protected.private修饰.也可以不加修饰符,称做友好类. 2.类的实体元素包含成员变量和方法的定义,成员变量分为实例变量和类变量(static修饰的 ...
- 查漏补缺之——Java多线程
复习面试题中遇到锁的内容当时大一学习的时候感觉懵懂,现在重新复习一下. 1.1多线程 1.1.1线程 1.什么是线程 线程是程序执行的一条路径,一个进程中包含多条进程 2.并行与并发 并行是两个任务同 ...
- ES6 新加的类型Symbol()
Symbol()如果一个对象中的键已经存在,但目前我们目前不知道这个键是存在的,然后我们去给这个键赋值,Symbol()就不会改变这个键对应的值
- input type="tel" 输入框显示密文
为了在移动端实现密码输入框且调起的键盘为数字键盘,可以用-webkit-text-security:disc;text-security:disc;属性来实现. 语法: text-security: ...