OpenCV 数据初始化空间分配

发现一个很好的OpenCV教学博客:http://monkeycoding.com/?p=531

看了看Mat的初始化方式,初始化是不分配空间的,而需要img.create()分配空间。

影像格式(Mat)

Mat是OpenCV訂定的資料型態,代表的是矩陣(Matrix)前三個字母,影像其實也可以看成是某個二維陣列,所以在OpenCV 2.0裡,不論矩陣計算,或是影像處裡的格式,都是以Mat類別進行處理,並有相關的成員變數和函式方便使用,使用時不用考慮記憶體管理,這也是OpenCV 1.0和2.0不同之處,這邊介紹常用的Mat類別成員和成員函式,包括如何得到影像資訊、創建影像、複製影像、改變位元深度和操作像素強度。

內文索引 [隱藏]

  • 1 影像資訊
  • 2 影像創建
  • 3 影像分配空間
  • 4 影像複製
  • 5 改變影像型態。
  • 6 操作像素
  • 7 操作像素
  • 8 歸零

影像資訊

Mat最基本有長、寬、像素型態、像素深度、通道數等資訊,以下介紹的成員變數或成員函式,讓我們得到這些資訊。

成員變數 意義
rows 影像的列數,也就是影像高
cols 影像的欄數,也就是影像寬


OpenCV通道數:int Mat::channels() const

  • 返回影像的通道數:灰階圖為1,彩色圖為3。

OpenCV像素深度:int Mat::depth() const

  • L以下表格列出部分返回的像素深度:
CV_8U 位元深度為8,U代表無負號
CV_8S 位元深度為8,S代表有負號
CV_16U 位元深度為16,無負號
CV_32F 浮點數

OpenCV像素型態:int Mat::type() const

  • 型態和深度主要差在型態有通道數資訊,比如CV_8UC3代表影像通道數3,以下表格列出部分返回的像素深度:
CV_8U 位元深度為8,無負號,通道數1
CV_8S 位元深度為8,有負號,通道數1
CV_16U 位元深度為16,無負號,通道數1
CV_32F 浮點數資料,通道數1
CV_8UC3 位元深度為8,無負號,通道數3

OpenCV影像尺寸:Size Mat::size() const

  • 返回影像的尺寸Size(cols, rows),cols和rows分別表示寬和高。

影像創建

OpenCV Mat建構式:Mat(int rows, int cols, int type, const cv::Scalar &s)

  • rows:影像高度。
  • cols:影像寬度。
  • type:影像型態。
  • s:像素值,我們可以在一開始建構式,就指定像素值,像灰階圖的強度,或是BGR分別的像素強度。
  • 要注意建構式的參數,是先輸入高度在寬度。

以下為使用方式:

Mat img1(240, 320, CV_8U);
Mat img2(240, 320, CV_8U, Scalar(100));
Mat img3(240, 320, CV_8UC3, Scalar(200,100,0));

影像分配空間

我們可以對空的或已有資料的Mat,重新分配空間,也就是改變影像的長、寬或像素型態。

OpenCV 空間分配:void Mat::create(int rows, int cols, int type)

  • rows:影像高度。
  • cols:影像寬度。
  • type:影像型態。
  • 參數是先輸入高度再寬度,且因為效率的考量,假使輸入的尺寸、型態和呼叫影像相同,函式直接返回,不會重新分配空間。

以下為使用方式:

Mat img;
img.create(300, 400, CV_8U);  

影像複製

這邊介紹三種複製影像的方式,第一種為多載等號運算子,第二、三種分別為Mat的成員函式。

OpenCV等號多載Mat& Mat::operator=(const Mat& m)

  • m:輸入圖,左邊影像和右邊影像相同,不會另外複製一份資料。

OpenCV影像複製:Mat::copyTo(OutputArray& m) const

  • m:輸出圖,輸出圖會變成和呼叫影像一樣的長、寬、像素值。

OpenCV影像複製:Mat Mat::clone() const

  • 返回和呼叫影像相同的一份複製影像。

用等號運算子時,如上面的img1和img2,兩者共用一份數據,所以只要改變一個,另一個會隨之變更,而copyTo()和clone()為複製一份新的數據,所以不會互相影響,以下為使用方式:

Mat img1(240, 320, CV_8U, Scalar(100));
Mat img2, img3, img4;             
img2 = img1;         
img1.copyTo(img3);    
img4 = img1.clone();    

改變影像型態。

void Mat::convertTo(OutputArray m, int rtype, double alpha=1, double beta=0)

  • m:輸出圖,如果尺寸或型態和呼叫影像不同,會重新分配空間。
  • rtype:輸出圖的型態,呼叫影像和輸出圖的通道數會相同。
  • alpha:輸出圖放大倍率,預設為1。
  • beta :輸出圖增加量,預設為0。

操作像素

at()用來訪問像素,可返回左值或右值,所以我們可用at()得到或改變某個像素值,這函式使用模板,所以使用時除了輸入位置,還必須需入影像的像素型態,使用at()函式時,輸入參數順序同樣為先高再寬。。

  • OpenCV改變像素:template T& Mat::at(int i, int j)
  • OpenCV讀取像素:template const T& Mat::at(int i, int j) const
  • 在灰階圖中,OpenCV裡可用uchar代替uncigned char,在彩色圖中,OpenCV裡可用Vec3b代替將3個uchar組成的容器(vector),且可在後面加上[],註明是要操作此像素的哪個通道。

下面操作一個8位元灰階圖,分別改變某個像素的值,以及查看此像素的值:

Mat gray_img(100, 100, CV_8U, Scalar(100));
gray_img.at<uchar>(30,20) =255;            
uchar value1 = gray_img.at<uchar>(30,20); 

下面分別改變彩色圖某個像素的第一通道值,以及查看此像素第一通道的值:

Mat color_img(100, 100, CV_8UC3, Scalar(200,100,0));
img.at<Vec3b>(30,20)[0] =255;        
uchar value2 = img.at<Vec3b>(30,20)[0]; 

操作像素

ptr函式輸入指定列,返回一個指標指向此列的第一個像素,通常為尋訪影像用到,ptr可讀取或改變像素值,同樣使用模板,所以也必須需入影像的像素型態。

  • OpenCV改變像素:template T* Mat::ptr(int i=0)
  • OpenCV讀取像素:template const T* Mat::ptr(int i=0) const

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软推出 Microsoft.Data.SqlClient,替代 System.Data.SqlClient

背景在 .NET 创建之初&#xff0c;System.Data 框架是一个重要的组件。它为创建 .NET 数据库驱动程序提供了一种方式&#xff0c;类似 Visual Basic 的 ActiveX Data Objects。虽然 API 不一样&#xff0c;但重用了它的名称&#xff0c;所以才有了 ADO .NET 这个绰号。ADO 和 A…

C++ 从文件夹中读取文件

OpenCV从文件夹中读取内含文件方法 参考&#xff1a;http://www.2cto.com/kf/201407/316515.html http://www.it610.com/article/5126146.htm http://blog.csdn.net/adong76/article/details/39432467 windows平台代码&#xff1a; [cpp] view plaincopy #include <io.h&…

你必须知道的容器监控 (1) Docker自带子命令与Weave Scope

本篇已加入《》&#xff0c;可以点击查看更多容器化技术相关系列文章。本篇会介绍几个目前比较常用且流行的容器监控工具&#xff0c;首先我们来看看Docker自带的几个监控子命令&#xff1a;ps、top以及stats&#xff0c;然后是一个功能更强的开源监控工具Weave Scope。# 实验环…

char *与char []

由于指针的灵活性&#xff0c;导致指针能代替数组使用&#xff0c;或者混合使用&#xff0c;这些导致了许多指针和数组的迷惑&#xff0c;因此&#xff0c;刻意再次深入探究了指针和数组这玩意儿&#xff0c;其他类型的数组比较简单&#xff0c;容易混淆的是字符数组和字符指针…

.NET Core ORM 类库Petapoco中对分页Page添加Order By对查询的影响

介绍最近一直在使用PetapocoEntity Framework Core结合开发一套系统。使用EFCore进行Code First编码&#xff0c;使用使用Petapoco进行数据库的常规操作。并且结合PetaPoco.SqlKata的使用&#xff0c;减少了编写SQL语句的工作量&#xff0c;对提升开发效率有很大的帮助。Petapo…

Mat详解-OpenCV

转自&#xff1a;http://blog.skyoung.org/2014/03/26/OpenCV(III)-How-to-use-Mat/ Mat类是OpenCV最基本的一个数据类型&#xff0c;它可以表示一个多维的多通道的数组。Mat常用来存储图像&#xff0c;包括单通道二维数组——灰度图&#xff0c;多通道二维数组——彩色图。当然…

.Net Core 3.0 IdentityServer4 快速入门

一、简介IdentityServer4是用于ASP.NET Core的OpenID Connect和OAuth 2.0框架。将IdentityServer4部署到您的应用中具备如下特点&#xff1a;1&#xff09;、认证服务2&#xff09;、单点登陆3&#xff09;、API访问控制4&#xff09;、联合网关5&#xff09;、专注于定制6&…

.NET Core3.0创建Worker Services

.NET CORE 3.0新增了Worker Services的新项目模板&#xff0c;可以编写长时间运行的后台服务&#xff0c;并且能轻松的部署成windows服务或linux守护程序。如果安装的vs2019是中文版本&#xff0c;Worker Services变成了辅助角色服务。Worker Services 咱也不知道怎么翻译成了这…

初学随机森林

http://blog.csdn.net/holybin/article/details/25653597 基础知识 [关于决策树的基础知识参考&#xff1a;http://blog.csdn.NET/holybin/article/details/22914417] 在机器学习中&#xff0c;随机森林由许多的决策树组成&#xff0c;因为这些决策树的形成采用了随机的方法&a…

OpenCV Mat数据类型像素操作

转自&#xff1a;http://blog.csdn.net/skeeee/article/details/13297457 OpenCV图像像素操作及效率分析 在计算机视觉应用中&#xff0c;对于图像内容的读取分析是第一步&#xff0c;所以学习高效的处理图像是很有用的。一个图像有可能包含数以万计的像素&#xff0c;从根本上…

Bumblebee微服务网关之Url重写

为了提高Url访问的统一和友好性&#xff0c;一般访问的Url和服务定义的Url有所不同;为了解决这一问题Bumblebee提供Url重写功能;通过Url重写功能可以在转发前进行一个重写后再转发到后台服务。引用插件Bumblebee中使用Url重写需要引用两个插件&#xff0c;分别是Bumblebee.Conf…

依赖注入:一个Mini版的依赖注入框架

前面的章节中&#xff0c;我们从纯理论的角度对依赖注入进行了深入论述&#xff0c;我们接下来会对.NET Core依赖注入框架进行单独介绍。为了让读者朋友能够更好地理解.NET Core依赖注入框架的设计与实现&#xff0c;我们按照类似的原理创建了一个简易版本的依赖注入框架&#…

t-SNE初学

http://www.datakit.cn/blog/2015/08/06/t_SNE.html 本文主要参考wikipedia&#xff0c;介绍t-SNE算法&#xff0c;以及python下的一些实现可视化应用。 目录 1、概述2、原理 2.1基本原理2.2详细过程2.4理由 3、算法流程4、python试用 1、概述 最开始接触t-SNE是在kaggle的比…

.NET Core 3.0 新 JSON API - JsonSerializer

JsonSerializer 前面几节的内容可能稍微有点底层&#xff0c;我们大部分时候可能只需要对C#的类进行串行化或者将JSON数据反串行化成C#类&#xff0c;在.NET Core 3.0里面&#xff0c;我们可以使用JsonSerializer这个类来做这些事情。 例子 还是使用之前用到的json数据&#xf…

Caffe查看每一层学习出来的pattern

Filter visualization http://www.cnblogs.com/dupuleng/articles/4244877.html 这一节参考http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/filter_visualization.ipynb&#xff0c;主要介绍如何显示每一层的参数及输出&#xff0c;这一部分非常重要&am…

.NET Core 3.0 新 JSON API - Utf8JsonWriter

Utf8JsonWriter类 下面研究一下如何写入json文件。这里需要使用Utf8JsonWriter类。 直接看代码&#xff1a; 这个类需要传递的参数类型是Stream或者Buffer&#xff0c;也就是向Stream或Buffer里面写入数据。 那么就提供一个buffer&#xff1a; 下面单独写一个方法&#xff0c;来…

力扣15 三数之和(Java版本)

文章目录 题目解题思路代码 题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中…

python查看CNN训练模型参数

参照&#xff1a;http://blog.csdn.net/u011762313/article/details/49851795 #!/usr/bin/env python# 引入“咖啡” import caffeimport numpy as np# 使输出的参数完全显示 # 若没有这一句&#xff0c;因为参数太多&#xff0c;中间会以省略号“……”的形式代替 np.set_prin…

Bumblebee微服务网关之consul服务发现

网关需要维护相关负载的服务器&#xff0c;手动添加相对来说是一件比较麻烦的工作&#xff1b;为了解决这一问题组件扩展了一个基于consul服务发现插件&#xff0c;通过配置这个插件和启用后网关会自动从consul服务中获取服务并添加到网关对应的路由负载规则中。引用插件Bumble…

Github带来的不止是开源,还有折叠的认知

几乎每个程序员都知道github&#xff0c;但是知道目前上面有多少repositories的估计没几个。Z哥今天去看了下&#xff0c;最新的数量显示是1.39亿个。▲截图来自于github.com而这个数字在2008年那会只是3.3万个。这个增长速度可谓真的是“爆炸式增长”。与此同时&#xff0c;大…