zoukankan      html  css  js  c++  java
  • 跟我一起学opencv 第三课之图像在opencv中的表示-Mat对象

    1.下面第一章图是一位美女图像,和其他数据一样图像在计算机中也是以二进制存储,下面第二张图

    2.在摄像头眼里一幅图像就是一个矩阵或者说是二维数组,数组元素是像素值

    3.opencv中以Mat对象表示图像的数据结构

    -------lpllmage是从2001年opencv发布之后就一直存在,是c语言表示的数据结构,需要开发者自己分配和管理内存,对大型程序使用它容易导致内存泄漏问题。

    -------Mat对象是opencv2.0之后引进的图像数据结构,自动分配内存,不存在内存泄漏问题,是面向对象的数据结构,分为两部分:头部和数据部分。

    4.Mat对象介绍

    (1)从文件加载一幅图像

        //从文件加载一幅图像
        Mat src;
        src = imread("E:\vsprom\learn03\nv02.jpg");
        if (src.empty())
        {
            cout << "can't load image..." << endl;
            return -1;
        }
        namedWindow("in win", CV_WINDOW_AUTOSIZE);
        imshow("in win", src);

    (2)根据一幅图像的尺寸和类型创建一副空图像

    	Mat dst;
    	dst = Mat(src.size(),src.type());
    	dst = Scalar(0, 0, 255);//初始化像素值B=127,G=0,R=255
    	namedWindow("out win", CV_WINDOW_AUTOSIZE);
    	imshow("out win", dst);
    

    截图显示

    (3)克隆图像与原图像一模一样

        Mat dst;
        //dst = Mat(src.size(),src.type());
        //dst = Scalar(0, 0, 255);//初始化像素值B=127,G=0,B=255
        dst = src.clone();//克隆出一幅图像
        namedWindow("out win", CV_WINDOW_AUTOSIZE);
        imshow("out win", dst);

    (4)拷贝和克隆一样,都是产生一幅与原来图像一样的一幅图

        src.copyTo(dst);//拷贝图像到dst与clone一样

    (5)图像转换(色彩空间的转换)cvtColor(src, dst, CV_BGR2GRAY);

    cvtColor(src, dst, CV_BGR2GRAY);//将src从BGR色彩空间转为灰度,并输出到dst这幅图中

    效果图:

    (6)Mat对象使用要点:

    -----输出图像的内存是自动分配的

    -----使用opencv的c++接口不用考虑内存分配问题

    -----赋值操作和拷贝构造函数只会复制头部分,不会赋值图像的数据部分

    -----使用clone和copyTo两个函数实现图像数据的完全拷贝

    (7)//访问dst的第一个像素的灰度值

        Mat m1;
        m1.create(src.size(), src.type());
        m1 = Scalar(0, 255, 0);

    (8)创建小数组,也就是我们前面使用的掩膜

    Mat ker = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

    (9)使用构造函数Mat M

    	Mat m(100,100,CV_8UC1,Scalar(127));//第一个参数行数,第二个参数列数,第三个参数8表示每个通道占8位,U表示无符号,C表示char类型,3表示通道数是3,第四个参数Scalar是向量表示初始化每个像素值是多少,向量长度对应通道数目一致
    	cout << "m=" << endl << m << endl;
    	//Mat ker = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    
    	namedWindow("out win", CV_WINDOW_AUTOSIZE);
    	imshow("out win", m);
    

    效果:

    (10)小技巧生成一个指定行数和列数的二维数组-zeros函数

        Mat m2 = Mat::zeros(2, 2, CV_8UC1);
        cout << "m2=" << endl << m2 << endl;

    效果图:

    有疑问可加QQ群:218436354

  • 相关阅读:
    Jenkins自动化部署入门详细教程
    单元测试
    弱网测试
    Token、Cookie和Session
    测试开发人员必备Linux命令
    TestNG(一)
    char和varchar
    你平时会看日志吗,一般会出现哪些异常(Exception)
    内存溢出和内存泄漏的区别,产生原因以及解决方案
    测试一个电梯
  • 原文地址:https://www.cnblogs.com/huipengbo/p/10739136.html
Copyright © 2011-2022 走看看