opencv基础到进阶(1)
Opencv是一个用户基础非常多的视觉开发库,可以用来实现人脸识别等功能,由于涉及到大量的调用与计算,所以对硬件的条件要求很高,并且还需要时时刻刻注意内存溢出这个问题,怎么样?很刺激吧。
从这篇文章开始我们从最基础学起,不同于其他学习博客,这个系列文章真的会是从最基础的开始讲解。
本文主要讲解Opencv的数据类型,已经最关键的类:Mat所拥有的强大的特性。
Opencv的C++类和函数都定义在命名空间CV中,有两种方法可以访问他们,在main函数前加入下面这句语句:
using namespace cv;
或者也可以在类和函数名前面添加cv::命名空间,这种情况下会需要打很多次cv::,所以还是推荐第一种方法。
opencv专门定义了一个用来保存图像以及其他矩阵数据的数据结构:cv::Mat;为什么是数据“矩阵”?因为从根本上来说,一张图像是一个由数值组成的矩阵。默认情况下其尺寸为0,若需要初始化尺寸的大小,可以使用下面这个语句:
cv:Mat ima(,,CV_8U,cv::Scalar());
在初始化时还需要指定矩阵数据的类型,矩阵中元素的类型:CV_8U对应的是单字节的像素图像。直接U意味着无符号的(Unsigned),也可以使用S声明带符号的类型(Signed),对于彩色图像,需要指定三个通道(CV_8UC3)。你也可以声明16位或32位的整数图像,如CV_16SC3。
当cv::Mat对象离开作用域后,分配的内存将自动释放,这是Mat类所拥有的强大特性,这样可以避免内存泄漏的困扰。cv::Mat另一个强大的特性是实现了引用计数和浅拷贝,当图像之间进行赋值时,图像数据并没有进行复制,两个对象都指向同一块内存块。这也可用于参数传值得的图像,以及返回值传值的图像。引用计数的作用是当所有引用数据的对象都被析构后,才会释放内存块,若需要创建的图像拥有原始图像的崭新拷贝,则可以使用copyTo()方法。
cv::Mat img2,img3;
img2 = result;//两个图拥有同一份数据
result.copyTo(img3);//创建新的拷贝
若这时再次翻转输出图像,并显示两幅额外的图像,那么你将会发现img2夜壶受到变换的影响(因为它指向的内存数据与输出图像是同一份),而img3保持原样,因为它包含的是一份新的拷贝。cv::Mat的内存分配的模型也意味着你自己成功的编写返回图像的函数或类的方法:
cv::Mat function(){
cv::Mat ima(,,CV_8U,cv::scalar());//创建图像
return ima;
}
//调用该函数
cv::Mat gray = function();
gray变量将包含函数中创建的图像内容,而不涉及额外的内存分配。事实上,函数返回的cv::Mat对象在转移到gray时仅发生浅拷贝。函数中的声明局部变量ima离开作用域是背析构,但是由于他所关联的引用计数表示内部图像正在被另一个对象gray所引用,因此内存块并不会被释放。
下面是一个小程序,不需要了解他的功能,你只需要大概了解下程序的框架就可以了:
#include "opencv2/imgproc.hpp" //包含的头文件,最简单直接的方法是直接包含:#include<opencv2/opencv.hpp>。这个hpp里面已经将所有功能模块的hpp都包含进去了。但是如果你需要使用其他的c++或c函数,还需要将对应的头文件包含进去。
#include "opencv2/highgui.hpp"
using namespace cv;
int main(int, char**)
{
VideoCapture cap();
if(!cap.isOpened()) return -;
Mat frame, edges;
namedWindow("edges",);
for(;;)
{
cap >> frame;
cvtColor(frame, edges, COLOR_BGR2GRAY);
GaussianBlur(edges, edges, Size(,), 1.5, 1.5);
Canny(edges, edges, , , );
imshow("edges", edges);
if(waitKey() >= ) break;
}
return ;
}
opencv基础到进阶(1)的更多相关文章
- opencv基础到进阶(2)
本文为系列文章的第2篇,主要讲解对图像的像素的操作方法. 2.1存取像素值 为了存取矩阵元素,需要指定元素所在的行和列,程序会返回相应的元素.单通道图像返回单个数值,多通道图像,返回的则是一组向量(V ...
- jQuery基础---Ajax进阶
原文:jQuery基础---Ajax进阶 内容提纲: 1.加载请求 2.错误处理 3.请求全局事件 4.JSON 和 JSONP 5.jqXHR 对象 发文不易,转载请注明出处! 在 Ajax 基础一 ...
- python基础——面向对象进阶下
python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...
- python基础——面向对象进阶
python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...
- Python基础与进阶
1 Python基础与进阶 欢迎来到Python世界 搭建编程环境 变量 | 字符串 | 注释 | 错误消除 他只用一张图,就把Python中的列表拿下了! 使用 If 语句进行条件测试 使用字典更准 ...
- 什么是图像 -- opencv基础
opencv基础篇--到底什么是图像 什么是图像?英语中有两个单词来形容图像,一个是picture,一个是image.这两者虽然是形容同一个东西,但却又有着区别.picture代表实而有物的真实图像: ...
- OpenCV基础篇之读取显示图片
程序及分析 /* * FileName : read.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 13 May ...
- Dart编程语言从基础到进阶1
Dart编程语言从基础到进阶Dart的语言的发展史以及Dart能做什么未来发展怎么样等等问题我们在这里是不讨论的.我相信既然选择了来学习它,那你内心基本已经认可了它,所以我们废话不多说直接进入主题. ...
- Git基础及进阶-系统总结
Git基础及进阶-系统总结 by 小强 2019-07-01 考虑到入职后不仅需要熟练掌握git的基本使用,在企业实际操作中还涉及一些进阶指令.作为一个程序员,熟练使用工具是一项基本技能,也是程序员的 ...
随机推荐
- C#中的泛型和泛型集合
泛型 泛型引入了一个概念:类型参数.通过使用类型参数(T)减少了运行时强制转换或装箱操作的风险,通过泛型可以最大限度的重用代码,保护类型的安全及提高性能,他的最常见应用就是创建集合类,可以约束集合类中 ...
- es6基础系列二:Number
es6中关于Number类型的变化,主要有以下几点 Number.isInteger(新增,判断是否为整数) Number.EPSILON(新增,判断是否可忽略的误差) Number.MAX_SAFE ...
- ## Python中的Package和Jupyter中import包问题
前言 关于python包的一些知识 Java中的package概念 我们知道在java中的import package概念, java中的包就是一个目录,里面包含着子目录,子目录套着子目录,当需要引入 ...
- Java NIO之Buffers
一.前言 在笔者打算学习Netty框架时,发现很有必要先学习NIO,因此便有了本博文,首先介绍的是NIO中的缓冲. 二.缓冲 2.1 层次结构图 除了布尔类型外,其他基本类型都有相对应的缓冲区类,其继 ...
- 新手介绍简单一下iOS开发中几种界面传值
首先在处理iOS-UI中,也许在很多地方需要用到两种甚至多种不同界面之间的传值,相比这也是很多iOS入门成员头疼问题,同样作为新手的我在接触这类传值时候也一脸懵然,经过一段时间的研究,对于简单的传值有 ...
- ASP.NET MVC5请求管道和生命周期
请求处理管道 请求管道是一些用于处理HTTP请求的模块组合,在ASP.NET中,请求管道有两个核心组件:IHttpModule和IHttpHandler.所有的HTTP请求都会进入IHttpHandl ...
- js日期转化(计算一周的日期)
之前做项目的时候遇到过一个日期转化的问题,一个日期控件和近一天,近七天和近一月的的联动效果.发现自己不会,后来就百度了一下解决了这个问题. 现在抽空又写了一个时间转化的案例(计算一周的日期),因为之前 ...
- List<Object>对象集合一些扩展方法
// 商品集合信息 List<Product> list = new List<Product>() { ...
- .NET遇上Docker - Docker集成Cron定时运行.NETCore(ConsoleApp)程序.md
配置项目的Docker支持 对于VS中Docker的配置,依旧重复一些废话. 给项目添加Docker支持,VS2015可以直接使用Docker for VS插件,VS2017在安装时选择容器支持.VS ...
- GoldenGate实施步骤
一.GoldenGate实施环境 source database:oracle 11.2.0.3 target database:oracle 11.2.0.3 需要配置的进程如下: source ...