Opencv 笔记 opencv tutorial 2.1节 mat

    前言:opencv中,mat类型非常基础和重要。以下是opencv tutorial 2.1章节的中英文整理。

    Mat
    简介

    IplImage c
    结构 需要管理内存

    mat是c++中的类class
    自动内存分配

    Mat 
    包括:

    header

    A pointer to the matrix containing the pixel values 
    (can take
    dimentionlity
    根据存储方法)

    头大小不变
     矩阵大小变
    复制数据的速度由矩阵大小决定

    将图像传给函数是常见做法

    图像处理很耗计算量
    避免不必要的大图像复制

    引用计数 reference counting

    每个mat有自己的头 但是他们可以共同指向一个矩阵地址

    ROI区域

    Mat D =  A(Rect(10,10,100,100) )//use a Rect

    Mat E = A(Range:all(),range(1,3);

    一个矩阵区域由多个mat掌控,但是不需要处理clean之类

    有一个counter计数header的数目,whenever
    a header is cleaned, the counter is decreased. When the counter is zero, the matrix is freed.

    复制矩阵数据的方式:修改F G 不会影响A

    Mat F = A.Clone()

    Mat G; A.CopyTo(G);

    A.copyTo(G,mask
    )  mask不为0的地方 复制

    Opencv 输出图像的allocation是自动的

    Opencv c++ interface 都不用考虑内存释放 memory freeing

    mat创建方式

    Mat A = Imread(Filename, CVLOADIMAGECOLOR)

    Mat B(A)  //copy constructor

    Mat C = A // assignment operator 只复制头

    A B C point to the same single matrix

    保存方法:

    颜色空间 color space
    + 数据类型 data type

    Grayscale

    RGB 
    适合人眼系统

    HSV
    对光照不敏感

    YCrCb jpeg
    图像格式

    CIE Lab
    用来计算颜色距离

    code the transparency of a color alpha(A)is needed

    Data type:  denth

    深度

    • 最小的是
      char 
      分为 unsigned
      (0-255)signed(-127-127) 
      1byte  Int 是2个字符呦
    • Float 32bits 4
      bytes
    • Double 64bits 8 bytes
    • Int
      类型的宏

    #define CV_8U    0

    #define CV_8S     1

    #define CV_16U  2

    #define CV_16S   3

    #define CV_32S   4

    #define CV_32F   5

    #define CV_64F   6

    #define CV_8UC1 CV_MAKETYPE(CV_8U,1)

    #define CV_8UC2 CV_MAKETYPE(CV_8U,2)

    #define CV_8UC3 CV_MAKETYPE(CV_8U,3)

    #define CV_8UC4 CV_MAKETYPE(CV_8U,4)

    #define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))

    #define CV_8SC1 CV_MAKETYPE(CV_8S,1)

    #define CV_8SC2 CV_MAKETYPE(CV_8S,2)

    #define CV_8SC3 CV_MAKETYPE(CV_8S,3)

    #define CV_8SC4 CV_MAKETYPE(CV_8S,4)

    #define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))

    #define CV_16UC1 CV_MAKETYPE(CV_16U,1)

    #define CV_16UC2 CV_MAKETYPE(CV_16U,2)

    #define CV_16UC3 CV_MAKETYPE(CV_16U,3)

    #define CV_16UC4 CV_MAKETYPE(CV_16U,4)

    #define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))

    #define CV_16SC1 CV_MAKETYPE(CV_16S,1)

    #define CV_16SC2 CV_MAKETYPE(CV_16S,2)

    #define CV_16SC3 CV_MAKETYPE(CV_16S,3)

    #define CV_16SC4 CV_MAKETYPE(CV_16S,4)

    #define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))

    #define CV_32SC1 CV_MAKETYPE(CV_32S,1)

    #define CV_32SC2 CV_MAKETYPE(CV_32S,2)

    #define CV_32SC3 CV_MAKETYPE(CV_32S,3)

    #define CV_32SC4 CV_MAKETYPE(CV_32S,4)

    #define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))

    #define CV_32FC1 CV_MAKETYPE(CV_32F,1)

    #define CV_32FC2 CV_MAKETYPE(CV_32F,2)

    #define CV_32FC3 CV_MAKETYPE(CV_32F,3)

    #define CV_32FC4 CV_MAKETYPE(CV_32F,4)

    #define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))

    #define CV_64FC1 CV_MAKETYPE(CV_64F,1)

    #define CV_64FC2 CV_MAKETYPE(CV_64F,2)

    #define CV_64FC3 CV_MAKETYPE(CV_64F,3)

    #define CV_64FC4 CV_MAKETYPE(CV_64F,4)

    #define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))

    显式创建mat类型:

    • 加载图像Load image

    E.g. Mat M = imread(file name,1)

    • Mat
      构造函数创建

    m() constructor 返回另一个mat的实例

    E.g Mat A(2,2,CV_8UC3, Scalar(0,0,255))

    查看mat数值可以直接用<<显示
    只能用于二维矩阵   E.g cout<<A

    • IplImage -->
      mat

    IplImage *img = cvLoadImage(filename,1)

    Mat mtx(img)  //只创造头 共享矩阵数据

    • create函数

    Mat M;

    M.create(4,4,CV_8UC2)  //不能用来初始化矩阵数值 it just reallocate. It‘s matrix Data memory if the new size doesn‘t fit into the old one;

    Create 创建的矩阵是连续的

    • Matlab类型初始化
      zeros() ones() eyes()

    E.g Mat m Mat ::zeros(2,2,CV_8UC3)

    • 使用comma separated initializer :

    E.g. Mat C = (Mat_<double>(3,3) <<0,0,1,…9)

    • clone() or CopyTo ()

    Create a new header for an existing Mat object and
    it

    E.g Mat RowRange  = C.row(1).clone()

    • 使用
      randu来填充matrix
      value

    Mat R = M(2,2,CV_8UC3)  
    赋值操作符

    Randu(R,Scalar::all(0), Scalar::all(0))

    • 使用C++ arrays and initialize via
      constructor
      //多维矩阵

    Int sz[3] = {2,2,2}

    Mat L(3, sz,CV_8UC(1),Scalar::all(0))// 2+维mat 
    其中数据类型写法请注意 
    u_C1[j] = Mat( img.size(),CV_8UC1, Scalar(0) );
    是有效的
    u_C1[j] = Mat( img.size(),CV_8UC1, 0 );是无效的

    • Convert image color space

    E.g Mat Converted

    CvtColor(M,Converted ,CV_RGB2GRAY)

    打印mat
    时可以用 format(R,"python")  csv numpy C

    下面都是示例代码:

    Load & display image use Opencv highgui module

    #include <opencv2/core/core.hpp>

    #include <opencv2/highgui/highgui.hpp>

    #include <iostream>  //for standard I/O

    using namespace cv;

    using namespace std;

    int main( int argc, char** argv )

    {

    if( argc != 2)

    {

    cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;

    return -1;

    }

    Mat image;

    image =
    imread(argv[1], IMREAD_COLOR); // Read the file

    if(! image.data )                      // Check for invalid input

    {

    cout <<  "Could not open or find the image" << std::endl ;

    return -1;

    }

    namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.

    imshow( "Display window", image );                // Show our image inside it.

    waitKey(0); // Wait for a keystroke in the window
    里面的参数表示用户要等多久0表示无限等下去
    直到用户按下

    return 0;

    }

    imread函数 第二个参数。

    ? CV_LOAD_IMAGE_UNCHANGED (<0) loads the image as is (including the alpha channel if present)

    ? CV_LOAD_IMAGE_GRAYSCALE ( 0) loads the image as an intensity one

    ? CV_LOAD_IMAGE_COLOR (>0) loads the image in the RGB format

    OpenCV offers support for the image formats Windows bitmap (bmp),
    portable image formats (pbm, pgm, ppm) and Sun raster
    (sr, ras). With help of plugins (you need to specify to use them if you build yourself the library, nevertheless in the packages we ship present by default) you may also load image formats
    like JPEG (jpeg, jpg, jpe), JPEG 2000 (jp2 - codenamed in the CMake as Jasper), TIFF files
    (tiff, tif) and portable network graphics (png). Furthermore, OpenEXR is also a possibility.

    namedWindow
    (file name ,第二个参数)。

    CV_WINDOW_AUTOSIZE 
    如果你不使用Qt只能使用这项

    CV_WINDOW_NORMAL (CV_WINDOW_KEEPRATIO)  (CV_WINDOW_FREERATIO).
    如果你使用Qt那么
    还可以设定是否改变原图比例

    Load modify and save an image

    #include <cv.h>

    #include <highgui.h>

    using namespace cv;

    int main( int argc, char** argv )

    {

    char* imageName = argv[1];

    Mat image;

    image = imread( imageName, 1 );

    if( argc != 2 || !image.data )

    {

    printf( " No image data \n " );

    return -1;

    }

    Mat gray_image;

    cvtColor( image, gray_image, CV_RGB2GRAY );

    imwrite( "../../images/Gray_Image.jpg", gray_image );

    namedWindow( imageName, CV_WINDOW_AUTOSIZE );

    namedWindow( "Gray image", CV_WINDOW_AUTOSIZE );

    imshow( imageName, image );

    imshow( "Gray image", gray_image );

    waitKey(0);

    return 0;

    }

    Imread Imwrite Imshow namedWindow
    中的目录参数都是
    char*

    曾经有一个疑问,CV_8U, Scalar(255)这样的是几通道?现在相同了,就是单通道。

时间: 2024-12-20 15:52:56

Opencv 笔记 opencv tutorial 2.1节 mat的相关文章

OpenCV笔记(十二)—自定义线性滤波器

在<OpenCV笔记(七)>中,写了四种线性滤波的方法:箱式滤波器.高斯滤波器.中值滤波器和双边滤波器. 在OpenCV中,我们可以使用filter2D函数自定义kernel进行线性滤波. void filter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point anchor=Point(-1, -1), double delta=0, int borderType=BORDER_DEFAULT) 参

OpenCV笔记(五)——基本的绘图操作

用OpenCV的话,也要会一些绘图的操作.主要是画线.圆.矩形.椭圆. 绘图的话,首先要了解两种类型:Point和Scalar. Point就是点的类,我们用它来表示图像当中的点,比如Point pt; pt.x = 10; pt.y = 8;或者Point pt = Point(10, 8); Scalar实质上就是4维的向量,也就是C++当中的含有4个元素的vector.一般我们只用到三维,比如Scalar(0, 0, 255); 一.线 void line(Mat& img, Point

【OpenCV笔记】使用VS2012和OpenCV2.4.9搭建配置OpenCV开发环境

使用MS Visual C++来创建OpenCV工程,由于不同的VS版本在配置时有所差别,现特把配置过程总结下来,以方便自己和其他朋友使用. 1.软件准备 安装Visual Studio2012和OpenCV2.4.9 这里就不再对软件的安装和环境变量的设置进行说明了,其他类似的文章的设置都大抵相似,本文重点介绍一下VS2012环境的配置. 2.配置VS2012环境 (1)新建工程 你可以创建简单的控制台应用或者拥有图形用户界面的复杂应用,此处我们选择最简单常用的控制台应用. 理解解决方案(So

OpenCV笔记大集锦(转载)

整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址:http://blog.csdn.NET/column/details/opencv-manual.html 2:部分OpenCV的函数解读和原理解读 作者:梦想腾飞数量:20篇博文网址:http://blog.csdn.Net/xidianzhimeng/article/category/1593

OpenCV Tricks[OpenCV 笔记3]

官方例程 事例程序位于opencv-3.1.0/samples/cpp/ 目录下,可以通过编译整个工程,编译所有的Sample Code 显示当前使用的OpenCV版本 CV_VERSION为标识当前OpenCV版本的宏 printf("\t OpenCV Version: OpenCV " CV_VERSION); 头文件opencv.hpp opencv2/opencv.hpp中包含了OpenCV各模块的头文件,原则上仅写一句: #include <opencv2/openc

Git帮助文档阅读笔记----第二章-第五节---打标签

本节我们一起来学习如何列出所有可用的标签,如何新建标签,以及各种不同类型标签之间的差别. 列显已有的标签 直接运行 git tag 即可: 可以用特定的搜索模式列出符合条件的标签.在 Git 自身项目仓库中,有着超过 240 个标签,如果你只对 1.4.2 系列的版本感兴趣,可以运行下面的命令: $ git tag -l 'v1.4.2.*' v1.4.2.1 v1.4.2.2 v1.4.2.3 v1.4.2.4 新建标签 轻量级的(lightweight) 含附注的(annotated)(建议

Git帮助文档阅读笔记----第二章-第四--节远程仓库的使用

管理这些远程仓库,以便推送或拉取数据 添加远程库 移除废弃的远程库 管理各式远程库分支 定义是否跟踪分支 查看当前的远程库 可以用 git remote 命令,它会列出每个远程库的简短名字 也可以加上 -v 选项(译注:此为 --verbose 的简写,取首字母),显示对应的克隆地址: 如果有多个远程仓库,此命令将全部列出.比如在我的 Grit 项目中,可以看到: 添加远程仓库 要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行 git remote add [shortname

opencv笔记(一)——Mat的引用计数机制

Mat是Opencv2里面主要的类.Mat的对象常常用来表示一副图像的信息. Mat的基本操作十分简单,不多说了.下面这段代码能够读七八分明白,应该就算对Mat有大体了解. 1 /* For description look into the help() function. */ 2 3 #include "opencv2/core/core.hpp" 4 #include <iostream> 5 6 using namespace std; 7 using names

图像储存容器Mat[OpenCV 笔记11]

IplImage 与 Mat IplImage是OpenCV1中的图像存储结构体,基于C接口创建.在退出之前必须release,否则就会造成内存泄露.在一些只能使用C语言的嵌入式系统中,不得不使用. IplImage* img = cvLoadImage("imagename.jpg",1); Mat类内存分配是自动完成的,不必手动开辟空间(非必须),不必在不需要时释放空间. Mat类的构成 Mat由矩阵头和一个指向存储图像矩阵的指针组成.为应该尽量避免图像的复制,加快程序运行速度,M