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. 基于51单片机IIC通信的AT24C02学习笔记

    引言 最近在学习几种串行通信协议,感觉收获很多,这篇文章是学习IIC总线协议的第一篇文章,以后还会再写一篇关于PCF8591 IIC通信的ADDA转换芯片的文章. 关于IIC总线 IIC 即Inter ...

  2. 关于css禁止文本复制属性

    最近在做DHTMLX框架替换,新框架dhx的grid是不能选中内容复制的 虽然相对来说是安全些的,但是客户体验度一定会大打折扣 网页上禁止复制主要靠JavaScript来实现.<BODY onc ...

  3. openssl命令行-证书认证

      命令1: openssl genrsa -out root.key 1024 产生一个root.key的私钥 命令2: openssl req -key root.key -new -out ro ...

  4. margin外边距合并问题以及解决方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. StringBuilder的实现

    先看看MS给出的官方解释吧 (http://msdn.microsoft.com/zh-cn/library/system.text.stringbuilder(VS.80).aspx) String ...

  6. 以防忘记,建立stm32工程的过程

    然后会弹出manage run -time environment的运行环境界面,必须选择的有CMSIS下的core和device下的startup,至于其它的根据你需要的外设, 在stdperiph ...

  7. CF #271 F Ant colony 树

    题目链接:http://codeforces.com/contest/474/problem/F 一个数组,每一次询问一个区间中有多少个数字可以整除其他所有区间内的数字. 能够整除其他所有数字的数一定 ...

  8. JS实现图片不间断滚动

    方法一: <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title ...

  9. 你想要的都在这里,ASP.NET Core MVC四种枚举绑定方式

    前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...

  10. IT软件开发中常用的英语词汇

    Aabstract 抽象的abstract base class (ABC)抽象基类abstract class 抽象类abstraction 抽象.抽象物.抽象性access 存取.访问access ...