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. activiti 一个流程的运转步骤 以请假流程为例

    ---为了加深对activiti的理解记忆,对自己做的一个流程进行自述.加强记忆 请假实例 一.设计请假的流程图以及流程文件,完善对应数据项,比如用户信息,请假单信息 --请假单 --流程图 --流程 ...

  2. NodeJs之http

    创建新的服务器 创建一个简单的服务 var http = require("http"); var server = http.createServer(); server.lis ...

  3. JavaScript学习总结 之对象

    JavaScript学习总结(二) ---- 对象 在JavaScript中,几乎用到的每个js都离不开它的对象.下面我们深入了解一下js对象. js中对象的分类跟之前我们学过的语言中函数的分类一样, ...

  4. ios runtime部分事例方法说明

    一.场景--动态改变变量 unsigned ; Ivar *ivar = class_copyIvarList([self.person class], &count); ; i<cou ...

  5. SysTick定时器

    SysTick是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值.只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息.下边小结了SysTick的相关寄 ...

  6. 海康/大华 IpCamera RTSP地址和格式

    海康:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream说明:username: 用户名.例如 ...

  7. java复习(6)---异常处理

    JAVA异常处理知识点及可运行实例 接着复习java知识点,异常处理是工程中非常重要的. 1.处理异常语句: try{ .... }catch(Exception e){ ..... } finall ...

  8. Unity CommandInvokationFailure: Failed to re-package resources. 解决方案

    在导入谷歌的SDK的时候,打包出来报错CommandInvokationFailure: Failed to re-package resources. 把Android SDK更新一下就轻松搞定了, ...

  9. Jsoup抓取、解析网页和poi存取excel综合案例——采集网站的联系人信息

    需求:采集网站中每一页的联系人信息 一.创建maven工程,添加jsoup和poi的依赖包 <!-- https://mvnrepository.com/artifact/org.apache. ...

  10. Spring事务隔离级别与传播机制详解,spring+mybatis+atomikos实现分布式事务管理

    原创说明:本文为本人原创作品,绝非他处转载,转账请注明出处 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). ...