參考文章:http://www.cnblogs.com/tornadomeet/archive/2012/07/19/2599376.html

实验说明: (引用)

  本文主要讲一些opencv 2.0版本号后出现的Mat矩形类,主要是參考opencv自带doc目录下的tutiol教材。通过这次实验认为用Mat的话以下几点须要特别注意(在代码中能够体现出来):

1. 利用create函数又一次改变Mat数据在内存中的布局。

2. 注意多通道数据在Mat中事实上也是占一个元素的位置的。 
3. 学会多维Mat的创建方法。
4. 当Mat矩阵比較小时。学会直接赋值的方法,即用Mat_。
5. 掌握Mat矩阵内容输出到终端时的几种常见格式。

6. 注意假设vector是单独一维的话须要转换成Mat才干输出。多维的能够直接输出,比如vector里面存放的是点的话。
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp> using namespace std;
using namespace cv; int demo_Mat()
{
int next_num = 1;
char tmp;
while(next_num<7)
{
cout<<"-------- "<<next_num<<" --------"<<endl;
waitKey(0); switch (next_num)
{
case 1:
{
Mat M( 2, 2, CV_8UC3, Scalar(0,255,0) );//事实上是2*6的矩阵,由于每一个元素有3个通道。 cout<<"create by using the constructor..."<<endl;
cout<<"M = \n "<<M<<endl; M.create( 4, 4, CV_8UC(2));//括号中面的2表示2通道
cout<< "create by using create function..."<<endl;
cout<<"M = \n "<<M<<endl;
break;
}//当case语句里面变量定义时,须要用括号括起来,否则会报错
case 2:
{
int sz[3] = {2, 2, 2};
Mat L( 3, sz, CV_8UC(1), Scalar::all(0) );
cout<< "create multidimensional matrix..."<<endl;
// cout<<"L = "<<L<<endl;此处不能打印出来,由于那仅仅适应二维数组
break;
}
case 3:
{
Mat E = Mat::eye(4, 4, CV_64F);
Mat O = Mat::ones(2, 3, CV_32F);
Mat Z = Mat::zeros(3, 3, CV_8UC1);
cout<< "using matlab stytle..."<<endl;
cout<<"E = \n "<<E<<endl;
cout<<"O = \n "<<O<<endl;
cout<<"Z = \n "<<Z<<endl;
break;
}
case 4:
{
Mat C =(Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);//直接赋初始值的方法
Mat row_clone = C.row(1).clone();
cout<< "create 3*3 double-precision identity matrix..."<<endl;
cout<<"C = \n "<<C<<endl;
cout<<"row_clone = "<<row_clone<<endl;
break;
}
case 5:
{
Mat R = Mat( 3, 2, CV_8UC3 );
randu( R, Scalar::all(0), Scalar::all(255) );
cout<< "fill a matrix with rand numbers..."<<endl;
cout<<"R (default) = "<<R<<endl;
cout<< "demonstrate the output formating options..."<<endl;
cout<<"R (python) = \n "<<format(R, "python")<<endl;
cout<<"R (numpy) = \n "<<format(R, "numpy")<<endl;//numpy是一个用python实现的科学计算包
cout<<"R (csv) = \n "<<format(R, "csv")<<endl;//csv,逗号分隔符
cout<<"R (c) = \n " <<format(R, "C")<<endl;
break;
}
case 6:
{
cout<< "the point format output..."<<endl; Point2f P1(5, 1);
cout<<"Point (2D) = "<<P1<<endl; Point3f P2(4, 5, 6);
cout<<"Point (3D) = "<<P2<<endl; vector<float>v;
v.push_back( (float)CV_PI);
v.push_back( 2 );//push_back为在其尾部增加一个数据
v.push_back( 3.01f );
cout<<"vector of float: = "<<Mat(v)<<endl;//vector数据是没法单独输出的,因此能够借助mat输出 int N = 20;
vector<Point2f>vPoints(N);//vector能够用变量定义其长度。比数组好用
for( size_t E = 0; E < vPoints.size(); ++E ) //size_t事实上就是一个unsigned int类型
vPoints[E] = Point2f((float)(E*5), (float)(E%7));
cout<<"vPoints[] = \n"<<vPoints<<endl;//可是vector点确实能够直接输出的。由于这时候的vector本身就是
//一个多维(至少2维)Mat了
break;
}
default:
break;
}
next_num++;
}
return 0;
}

执行结果:

OpenCV基本图像容器Mat的几种创建方法的更多相关文章

  1. pandas-01 Series()的几种创建方法

    pandas-01 Series()的几种创建方法 pandas.Series()的几种创建方法. import numpy as np import pandas as pd # 使用一个列表生成一 ...

  2. RealSense开发-Session和SenseManager的几种创建方法

    从Intel RealSense 的SDK文档对其架构(如图1所示)的始描述可知,Session是SDK应用的主控模块,必须在所有模块操作之前创建,并且在所有模块注销后最后注销.SenseManage ...

  3. OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式

    以最简单的4 x 5三通道图像为例,其在内存中Mat类型的数据组织形式如下: 每一行的每一列像素的三个通道数据组成一个一维数组,一行像素组成一个二维数组,整幅图像组成一个三维数组,即: Mat.dat ...

  4. Java 数组的三种创建方法

    public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intValue=arr[5]; //S ...

  5. Java 数组的三种创建方法,数组拷贝方法

    public static void main(String[] args) {//创建数组的第一种方法int[] arr=new int[6];int intValue=arr[5];//Syste ...

  6. JavaScript 对象的几种创建方法

    /** * Created by 2016 on 2016/6/4. */ function Box(){ var obj = new obj(); obj.name = "Lee" ...

  7. OpenCV MAT基本图像容器

    参考博客: OpenCv中cv::Mat和IplImage,CvMat之间的转换 Mat - 基本图像容器 Mat类型较CvMat和IplImage有更强的矩阵运算能力,支持常见的矩阵运算(参照Mat ...

  8. Js基础知识4-函数的三种创建、四种调用(及关于new function()的解释)

    在js中,函数本身属于对象的一种,因此可以定义.赋值,作为对象的属性或者成为其他函数的参数.函数名只是函数这个对象类的引用. 函数定义 // 函数的三种创建方法(定义方式) function one( ...

  9. 几种创建XMLHttpRequest对象的方法

    XMLHttpRequest对象,也就是Ajax交互的核心对象. 这里列举三种创建Ajax对象的方法. 第一种: <!DOCTYPE html> <html> <head ...

随机推荐

  1. Python爬虫-Scrapy-CrawlSpider与ItemLoader

    一.CrawlSpider 根据官方文档可以了解到, 虽然对于特定的网页来说不一定是最好的选择, 但是 CrwalSpider 是爬取规整的网页时最常用的 spider, 而且有很好的可塑性. 除了继 ...

  2. Python 装饰器 property() 函数

    描述:property() 函数的作用是在新式类中返回属性值. @property 装饰器简单理解就是负责把一个方法变成属性调用 下面理解property()方法语法: class property( ...

  3. noi.ac NOIP2018 全国热身赛 第四场 T1 tree

    [题解] 考虑从小到大枚举边权,按顺序加边. 当前树被分成了若干个联通块,若各个块内的点只能跟块外的点匹配,那么最终的min g(i,pi)一定大于等于当前枚举的边. 判断各个联通块内的点是否全部能跟 ...

  4. Struts2的线程安全性

    [什么是线程安全性?] 在多线程并发访问的情况下,如果一个对象中的变量的值不会随访问的线程而变化则是线程安全的.反之则称为非线程安全的. [Servlet是线程安全的吗?] [非线程安全的] publ ...

  5. 局域网虚拟机端口映射访问apache

    如果我们在虚拟机内搭建好服务器后,希望可以在局域网内的设备上都能访问到这个虚拟服务器,就可以参照以下步骤来操作.其中包括了很多遇到的坑.先说说我的环境是 宿主机:windows 8.1 虚拟机:vmw ...

  6. UVA10673 上下界问题

    #include <iostream> #include<cstdio> using namespace std; #define LL long long LL a,b,m, ...

  7. BZOJ4551 - [TJOI2016]树

    Portal Description 给出一棵\(n(n\leq10^5)\)个点的以\(1\)为根的有根树,进行\(Q(Q\leq10^5)\)次操作: 标记一个点\(x\). 询问\(x\)的祖先 ...

  8. hdu 2831

    #include<stdio.h> #include<stdlib.h> struct node{ int x,y,j,num; }a[110]; int cmp(const ...

  9. HDU 5573 Binary Tree【构造】

    几天前模拟区域赛的一道题,今天发现在草稿箱里直接补个博客. 感觉这还是一道很有意思的构造题. 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5573 ...

  10. Pick-up sticks--poj2653(判断两线段是否相交)

    http://poj.org/problem?id=2653 题目大意:有n根各种长度的棍   一同洒在地上 求在最上面的棍子有那几个 分析:  我刚开始想倒着遍历  因为n是100000   想着会 ...