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 ...
随机推荐
- Python在金融量开源项目列表
Python也已经在金融量化投资领域占据了重要位置,开源项目列表:
- spring 的web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java ...
- P2P原理(转)
P2P(Peer to Peer)对等网络 P2P技术属于覆盖层网络(Overlay Network)的范畴,是相对于客户机/服务器(C/S)模式来说的一种网络信息交换方式.在C/S模式中,数据的分发 ...
- 用java 集合和映射实现文章的单词数目统计
package 一_统计字母出现; import java.io.File; import java.io.FileNotFoundException; import java.util.HashMa ...
- 进程管理工具supervisor的使用
centos 6.5, python 2.6, supervisor 3.3.1: Linux下后台运行程序通常的做法是用nohub,然后配以进程的检测来实现服务式的操作,但其实有更好的选择super ...
- 原生JS实现简易转盘抽奖
我爱撸码,撸码使我感到快乐. 大家好,我是Counter. 本章带大家来简单的了解下原生JS实现转盘抽奖. 因为主要涉及到JS,在这里HTML和CSS起到的功能就没有那么重要, 因此,没有过多的阐述H ...
- JavaScript-DOM(1)
DOM简介 DOM 节点分类 DOM 节点层级关系 1.文档节点 1.父节点 2.标签(元素)节点 2.子节点 3.属性节点 3.兄弟节点 4.注释节点 4.根节点 5.文本节点 DOM节点分类 DO ...
- css基础参考文档
block inline-block inline区别 absolute定位详解:https://www.jianshu.com/p/a3da5e27d22b css浮动详解 float浮动 div变 ...
- 【四】jquery之文档处理习题(内部处理、外部处理)[移动节点]
参考资料:http://jquery.cuishifeng.cn/index.html 代码: <!DOCTYPE html> <html> <head> < ...
- Axure 页面内多组内容切换的实现 + 利用一个内联框架实现百度地图访问
Axure 页面内多组内容切换的实现,场景:点击某个元件的时候,会显示响应的页面 操作:将显示的页面设置为动态面板,如图所示应该设置动态面板的状态为三个状态,分别为点击qq账号.手机账号.邮箱账号时 ...