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)的更多相关文章

  1. opencv基础到进阶(2)

    本文为系列文章的第2篇,主要讲解对图像的像素的操作方法. 2.1存取像素值 为了存取矩阵元素,需要指定元素所在的行和列,程序会返回相应的元素.单通道图像返回单个数值,多通道图像,返回的则是一组向量(V ...

  2. jQuery基础---Ajax进阶

    原文:jQuery基础---Ajax进阶 内容提纲: 1.加载请求 2.错误处理 3.请求全局事件 4.JSON 和 JSONP 5.jqXHR 对象 发文不易,转载请注明出处! 在 Ajax 基础一 ...

  3. python基础——面向对象进阶下

    python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...

  4. python基础——面向对象进阶

    python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...

  5. Python基础与进阶

    1 Python基础与进阶 欢迎来到Python世界 搭建编程环境 变量 | 字符串 | 注释 | 错误消除 他只用一张图,就把Python中的列表拿下了! 使用 If 语句进行条件测试 使用字典更准 ...

  6. 什么是图像 -- opencv基础

    opencv基础篇--到底什么是图像 什么是图像?英语中有两个单词来形容图像,一个是picture,一个是image.这两者虽然是形容同一个东西,但却又有着区别.picture代表实而有物的真实图像: ...

  7. OpenCV基础篇之读取显示图片

    程序及分析 /* * FileName : read.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 13 May ...

  8. Dart编程语言从基础到进阶1

    Dart编程语言从基础到进阶Dart的语言的发展史以及Dart能做什么未来发展怎么样等等问题我们在这里是不讨论的.我相信既然选择了来学习它,那你内心基本已经认可了它,所以我们废话不多说直接进入主题. ...

  9. Git基础及进阶-系统总结

    Git基础及进阶-系统总结 by 小强 2019-07-01 考虑到入职后不仅需要熟练掌握git的基本使用,在企业实际操作中还涉及一些进阶指令.作为一个程序员,熟练使用工具是一项基本技能,也是程序员的 ...

随机推荐

  1. CTF入门指南(0基础)

    ctf入门指南 如何入门?如何组队? capture the flag 夺旗比赛 类型: Web 密码学 pwn 程序的逻辑分析,漏洞利用windows.linux.小型机等 misc 杂项,隐写,数 ...

  2. 前端开发框架简介:angular和react

    作者:vienwu react是facebook推出一个用来构建用户界面的js库.官方介绍的三大特性如下: just the ui 把react只当作一个ui组件就好,等同于传统mvc中的view. ...

  3. toastr.js插件用法

    toastr.js插件用法 toastr.js是一个基于jQuery的非阻塞通知的JavaScript库.toastr.js可以设定四种通知模式:成功.出错.警告.提示.提示窗口的位置.动画效果等都可 ...

  4. SSL证书的生成方法

    在Linux下,我们进行下面的操作前都须确认已安装OpenSSL软件包. 1.创建根证书密钥文件root.key: [root@mrlapulga:/etc/pki/CA/private]#opens ...

  5. 关于ajax post请求跨域问题的解决心得

    最近啊,公司有个项目,需要做一个手机端APP的后台管理系统.所以用到了度文本编辑框,经过了好好一番周折,终于弄好了,带到上线的时候发现啊,只能使用ip去访问网页的时候上能穿图片他不会报跨域的问题,而使 ...

  6. Java线程池(ThreadPool)详解

    线程五个状态(生命周期): 线程运行时间 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间.    如果:T1 + T3 远大于 T2,则可以 ...

  7. h5 实现调用系统拍照或者选择照片并预览

    这次又来分享个好东西! 调用手机相机拍照或者是调用手机相册选择照片,这个功能在 手机端页面 或者 webApp 应该是常用到的,就拿个人或会员资料录入那块来说就已经是经常会碰到的, 每当看到这块功能的 ...

  8. 个人VIM配置实例

    用户 vimrc 文件: "$HOME/.vimrc" " vimrc by lewiyon@hotmail.com " last update 2013-10 ...

  9. redis持久化快速回忆手册

    Redis提供的持久化机制: 1). RDB持久化:该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘. 2). AOF持久化:该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服 ...

  10. DIV+CSS 规范命名集合

    一: 命名规范说明: 1).所有的命名最好都小写 2).属性的值一定要用双引号("")括起来,且一定要有值如class="divcss5",id="d ...