精华内容
下载资源
问答
  • Mat 创建图像的理解

    千次阅读 2018-06-08 08:54:52
    Mat类型: 创建Mat图像处理矩阵的时候,要注意得到的是几个通道的图像。1,若直接Mat image;则创建的是一个任意通道的矩阵,他可以储存任何通道数的转换后的图像,但是!请注意!如果没有用到类似于cvtColor(image,...

     Mat类型:     

    创建Mat图像处理矩阵的时候,要注意得到的是几个通道的图像。

    1,若直接Mat image;则创建的是一个任意通道的矩阵,他可以储存任何通道数的转换后的图像,但是!请注意!如果没有用到类似于cvtColor(image,gray,CV_RGB2GRAY)这种转换函数,例如只是用了经过各种操作得到的像素值进行直接赋值,则就会出现错误。因为此时创建的Mat图像的通道数是不确定的,直接赋值显然是错误的。可以直接Mat(image.rows,image.cols,CV_8UC1);则创建的是一个单通道的图像。

    CV_8UC1 是指一个8位无符号整型单通道矩阵,

    CV_32FC2是指一个32位浮点型双通道矩阵

    CV_8UC1           CV_8SC1          CV_16U C1       CV_16SC1 
    CV_8UC2           CV_8SC2          CV_16UC2        CV_16SC2 
    CV_8UC3           CV_8SC3          CV_16UC3        CV_16SC3 
    CV_8UC4           CV_8SC4          CV_16UC4        CV_16SC4 
    CV_32SC1         CV_32FC1         CV_64FC1
    CV_32SC2         CV_32FC2         CV_64FC2
    CV_32SC3         CV_32FC3         CV_64FC3

    CV_32SC4         CV_32FC4         CV_64FC4

    Mat的一个构造函数 C++: Mat::Mat(int rows, int cols, int type, const Scalar& s) ,其中rows和cols是需要创建的矩阵的行数和列数,type是Mat的数据类型,s是Scalar类型的矩阵初值。

    对于type,是基本数据类型,首先有枚举 enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 }; 分别对应,8位无符号(uchar)、8位有符号(char)、16位无符号(ushort)、16位有符号(short)、32位有符号(int)、32位浮点(float)和64位双精度(double);其次 CV_8UC1、CV_16FC2、.. CV_64FC4等是多通道的类型,可以用CV_(深度)(类型)(通道数)描述, 例如本例中CV_8UC3,是指8位无符号3通道,其他类推。

    对于s的Scalar类型,它的源头实际是一个4行1列的Mat,这里的Scalar(0,0,255),直接可以理解成M矩阵的每一个元素都是(0,0,255),当M看成图像,就是一个2x2的红色方块,Scalar有3个值,可以对应RGB色彩,通道顺序为(B,G,R)。那么,CV_8UC2,可以用Scalar(1,2)赋值,CV_64UC4可以用Scalar(0,0.1,0.08,100.1)赋值,其他类推。


    展开全文
  • opencv Mat创建图像

    千次阅读 2017-04-11 10:09:13
    1、Mat创建、复制 /* * Create Mat */ Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255)); // 构造函数的一种 cout "M=" " " Mat A; M.copyTo(A); M.release(); cout // 释放不影响 Mat B; B =...

    1、Mat的创建、复制

    /*
    * Create Mat
    */
    Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255));   // 构造函数的一种
    cout << "M=" << endl << " " << M << endl << endl;
        
    Mat A;
    M.copyTo(A);
        
    M.release();
    cout << A << endl;        // 释放不影响
        
     Mat B;
    B = M.clone();
         
     M.release();

    cout << "B=" << endl << " " << B << endl<<endl;


    Mat src;
    src.create(256, 256, CV_8UC(2));



    2、Mat的释放

    Mat mat1 = Mat::ones(1, 5, CV_32F);
    Mat mat2 = mat1;                        // 仅创建一个mat2信息头, mat1,mat2 数据区的地址相同
    Mat mat3 = Mat::zeros(1, 4, CV_32F);
    mat2.release();          //  因为mat2是对mat1的引用,这里的mat2.release()只会清除mat2的信息头和数据指针
    mat1.release();         //  mat1的数据区都会被释放,但是mat信息头数据还会保存(也就是还能继续被赋值)
    cout << mat1 << endl;
    cout << mat2 << endl;
    cout << mat3 << endl << endl;
    mat3.copyTo(mat1);// 拷贝会给mat1从新分配数据区域,其原来的数据区还会保留,即mat2的数据是原来mat1的数据,
    //mat1 = mat3.clone();  // 最终结果是mat1和mat3的数据相同,但是数据存储空间不同,  mat2存储的是mat1最初的值
    mat3.release();        // mat3的释放不会影响mat1
    cout << mat1 << endl;
    cout << mat2 << endl;
    
    
    
    
    
    
    //【14】存取彩色图像的像素
    	for(int i=0;i<dstDeep1.rows;i++)
    	{
    		for(int j=0;j<dstDeep1.cols;j++)
    		{
    			dstDeep1.at<Vec3b>(i,j)[0]=255;//蓝色通道
    			dstDeep1.at<Vec3b>(i,j)[1]=255;//红色通道
    			dstDeep1.at<Vec3b>(i,j)[2]=255;//绿色通道
    		}
    	}
    	
    单通道
    
    
    【14】存取灰度图像的像素
    	for(int i=0;i<dstDeep1.rows;i++)
    	{
    		for(int j=0;j<dstDeep1.cols;j++)
    		{
    			dstDeep1.at<uchar>(i,j)=255;//蓝色通道
    			
    		}
    	}

    
    

    展开全文
  • 创建Mat图像

    千次阅读 2018-04-16 09:11:54
    方法1:cv::Mat::Mat构造函数 ...//CV_8UC1:图像的typpe。8:8位,UC:unsigned char,1:深度 //Scalar()是向量,表示初始化每个像素值是多少,向量长度与通道数目(深度)一致 cv::Mat image(HEIGHT, WIDTH, C...

    方法1:cv::Mat::Mat构造函数

    #define HEIGHT 2048 //行rows
    #define WIDTH 1024  //列cols 
    
    //CV_8UC1:图像的typpe。8:8位,UC:unsigned char,1:深度
    //Scalar()是向量,表示初始化每个像素值是多少,向量长度与通道数目(深度)一致
    cv::Mat image(HEIGHT, WIDTH, CV_8UC1, cv::Scalar(0));

    方法2(不常用):cv::Mat::create

    Mat image;
    //CV_8UC1:图像的typpe。8:8位,UC:unsigned char,2:深度
    image.create(HEIGHT, WIDTH, CV_8UC2);
    image = Scalar(127,127);
    展开全文
  • 创建Mat空间 (1) 通过Mat 构造函数直接创建 Mat mat(3000,4000,CV_8UC3); (2) 使用mat.Create创建 mat.Create(rows,cols,CV_8UC1) Opencv 提供了isContinuous来判断存储空间是否是连续的,通过step记录 ...

    创建Mat空间

    (1) 通过Mat 构造函数直接创建

          Mat mat(3000,4000,CV_8UC3);

    (2) 使用mat.Create创建

         mat.Create(rows,cols,CV_8UC1)

    Opencv 提供了isContinuous来判断存储空间是否是连续的,通过step记录

    Opencv 遍历图像像素

    1) 访问连续空间

    直接地址访问连续空间

    int size = mat.rows*mat.cols*mat.elemSize();

    int es = mat.elemSize();

    for(int i= 0;i< size;i+= es)

    {

           mat.data[i] = 0;   //B

           mat.data[i+1] = 0;  //G

           mat.data[i+2] = 0; //R

    }

    2)访问不连续空间

    方法一:直接地址访问不连续空间

    for(int i = 0; i < mat.rows;i++)

    {

            for(int j = 0; j < mat.cols; j++)

           { 

                    (&mat.data[i*mat.step])[j*mat.elemSize()] = 255;   //B

                     (&mat.data[i*mat.step])[j*mat.elemSize()+1] = 255;   //G

                      (&mat.data[i*mat.step])[j*mat.elemSize()+2] = 255;   //R

            }

    }

    方法二: 通过ptr接口遍历Mat (模板函数)

    (1) mat.ptr<Vec3b>(row) ; //返回的指针 可以直接只取某一行的数据

    (2) mat.ptr<Vec3b>(row,col); //可以直接支取某一行某一列的数据,除了代码的简洁性之外,还有一个好处就是在C++当中它会抛出异常,直接地址访问一旦发生异常不确定,有可能程序直接宕掉有可能继续运行出现更意外的错误,而通过ptr遍历Mat它会程序一旦发生错误,它会抛出一个异常,我们可以通过捕获这个异常做相对于的处理。

    for(int row = 0;row <mat.rows; row++)

    {

           for(int col = 0; col < mat.cols; col++)

          {

                 Vec3b *c = mat.ptr<Vec3b>(row,col);

                  c->val[0] = 0;  //B

                  c->val[1] = 0;  //B

                  c->val[2] = 0;  //B

         }

    }

    方法三: 通过at接口遍历Mat (模板函数)

    与ptr不同的是不操作地址,而是直接操作对象,接口最简单的遍历方法 。

    (1) mat.at<Vec3b>(row,col)[0] = 255;   

    (2) mat.at<Vec3b>(row,col)[1] = 0;

    (3) mat.at<Vec3b>(row,col)[2] = 255;

    for(int row = 0;row <mat.rows; row++)

    {

           for(int col = 0; col < mat.cols; col++)

          {

                Vec3b  &m =  mat.at<Vec3b>(row,col); //定义一个引用变量,一定要定义引用变量,把一个引用赋给一个普通变量会做拷贝,引用本身可以说不占内存,跟编译器有关。

                m[0] = 100;  //B

                m[1] = 100;  //G

                m[2] = 100;  //R

         }

    方法四:通过迭代器遍历Mat

    好处:可以不用管mat 的行列(大小)、类型

    auto it = mat.begin<Vec3b>0;

    auto it_end = mat.end<Vec3b>0;

    for(; it != it_end;++it)

    {

          (*it).val[0] = 0;

          (*it).val[1] = 255;  

          (*it).val[2] = 0;

    }

     

     

     

     

     

    展开全文
  • OpenCV学习笔记之创建Mat图像

    万次阅读 2018-10-21 20:41:56
    今天总结了5种创建Mat图像的方法,都是可以直接运行的。 代码: #include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; int main() { /* CV_8UC1 8位1...
  • 1.Mat创建一个图像dst_img 2.在dst_img里画了两个矩形滚动条 3.img里的某个区域A(比dst_img小)复制到dst_img中 发现滚动条不见了,dst_img的大小变成了区域A的大小,感觉用Mat创建的变量和用imread读出来不一样...
  • //整理创建Mat的方法 //1. 使用Mat()构造函数构建 /** @overload @param rows Number of rows in a 2D array. 二维数组的行数,又图像的高度 @param cols Number of columns in a 2D array. 二维数组的列数,又...
  • 1--我们知道Mat是一个图像容器类,这个数据结构由两...这样声明类对象的时候,也仅仅是创建了一个Mat的信息头,并没有创建矩阵体,也就是说,我们并 没有给将要存储的图像开辟相应的空间 2--矩阵头--包含: 1--矩阵
  • opencv2 cv::mat resize图像缩放代码

    千次阅读 2017-10-24 11:04:46
    首先定义scale变量,图片要缩放的倍数。 然后用Mat函数创建image矩阵,并加载图像。 Size函数是设置图像框架大小 resize函数调整图片大小。
  • OpenCV Mat-基本图像容器Mat-基本图像容器目标Mat存放方法Storing methods显式创建Mat对象输出格式其他共同项目的产出 Mat-基本图像容器 目标 我们有多种从现实世界中获取数字图像的方法:数码相机,扫描仪,计算机...
  • 一)Mat矩阵(图像容器)创建时CV_8UC1,CV_8UC2等参数详解 1--Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类 2--创建一个Mat对象的方法很多     3--使用Mat图像容器类创建Mat类的对象    //...
  • opencv之cv::Mat创建

    2019-01-02 23:04:00
    opencv之cv::Mat创建 简介 cv::Mat 是一个类,由两个数据部分组成:矩阵信息头(包含矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同, 矩阵可以是不同的维数)的...
  • 创建MAT

    2015-12-25 11:02:12
    创建一个Mat对象有多种方法: Mat() 构造函数 Mat M(2,2, CV_8UC3, Scalar(0,0,255)); cout "M = " endl " " M endl endl; 对于二维多通道图像,首先要定义其尺寸,即行数和列数。 ...
  • 图像容器Mat

    2019-09-20 17:50:05
    基础图像容器Matopencv中的图像存储图片的存储Mat类的数据组成图片的复制 opencv中的图像存储 这个部分主要介绍opencv存储图片的两种方式:IplImage和Mat;接着介绍Mat类的数据组成,最后介绍如何复制图片。 图片的...
  • 创建Mat对象

    2017-03-14 22:52:00
    Mat 是一个非常优秀的图像类,它同时也是一个通用的矩阵类,可以用来创建和操作多维矩阵。...除了在构造函数中可以创建图像,也可以使用 Mat 类的 create()函数创建图像。如果 create()函数指定的参数与图像之前的...
  • 读入Mat矩阵(cvMat一样),Mat img=imread("*.*");//cvLoadImage //确保转换前矩阵中的数据都是uchar(0~255)类型(不是的话量化到此区间),这样才能显示。(初学者,包括我经常忘了此事) //2.根据矩阵大小创建(CImage:...
  • 创建Mat 对象

    千次阅读 2013-03-01 13:31:15
    为此,你可以通过 Mat 的运算符 Mat 不但是一个很赞的图像容器类,它同时也是一个通用的矩阵类,所以可以用来创建和操作多维矩阵。创建一个Mat对象有多种方法:矩阵。创建一个Mat对象有多种方法:Mat() 构造函数对于...
  • 创建一个Mat对象的多种方法: 1:使用Mat()构造函数 Mat(2,2,CV_8UC3,Scalar(0,0,255)); 对于二维多通道图像,首先要定义的是其尺寸,即行数和列数。然后需要指定存储元素的数据类型以及每个矩阵点的...
  • 显式创建Mat

    2019-07-10 19:38:08
    创建Mat对象可有以下方法: 方法一:使用Mat()构造函数  例子如下: Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255)); 在Mat类定义中该构造函数的原型为: Mat(int rows, int cols, int type,const Scalar& s); ...
  • Mat对象 OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。 分了两个部分,头部与数据部分。 IplImage 是从2001年OpenCV发布之后就一直存在,是C语言风格的数据结构,...
  • 实验说明: (引用) ... 本文主要讲一些opencv 2.0版本后出现的Mat矩形类,主要是参考opencv自带doc文件夹下的tutiol教材。通过这次实验觉得用Mat的话下面几点需要特别注意(在代码中可以体现出来): 1. 利
  • (一)Mat矩阵(图像容器)创建时CV_8UC1,CV_8UC2等参数详解 1–Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类 2–创建一个Mat对象的方法很多,我们现在先看一下Mat矩阵/图像容器类在OpenCv中的有关源...
  • 在一次项目中,我预先声明了一个Mat对象,此时只创建图像矩阵的信息头部分,并没有创建矩阵体! 后来在要申请矩阵实体的内存时,遇到了两个问题 问题一 使用create创建矩阵实体 使用create方法来创建矩阵实体时,...
  • 基础图像容器Mat

    2020-08-06 20:28:15
    一:创建Mat对象的方法 二:特殊矩阵初始化:zeros()全零矩阵;ones()全1矩阵;eye()对角线矩阵。 三:随机初始化矩阵并输出 四:定义二维点和三维点 五:定义和输出基于Mat的std::vector 六:常用数据结构和...
  • (一)Mat矩阵(图像容器)创建时CV_8UC1,CV_8UC2等参数详解 1--Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类 2--创建一个Mat对象的方法很多,我们现在先看一下Mat矩阵/图像容器类在OpenCv中的有关...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 713
精华内容 285
关键字:

mat创建图像