码迷,mamicode.com
首页 > 其他好文 > 详细

OpenCV 矩阵—图像的基本

时间:2014-08-05 09:42:49      阅读:316      评论:0      收藏:0      [点我收藏+]

标签:opencv   mat   矩阵   

OpenCV  矩阵—图像的基本

         我们有很多方式可以从现实生活中得到图片,数码相机,扫描仪,或者我们几乎人手有一部的手机。然而,当生活中的图在数字设备上存储的时候,一幅图片被分成了很多很多的像素点,像素点就像拼图的时候的碎片,一个个碎片来构成一副图。而每个像素点都是由一个0-255的数字值来表示。在openCV中,一个图片被很多像素点表示,这些表示像素点的值构成了一个矩阵。

        bubuko.com,布布扣

         上面的图中,由表示像素点的值构成了矩阵,在openCV中,Mat(矩阵)是表示图片的基本。

         Mat由两部分组成,一个是matrixheader,里面存储了一些信息,比如矩阵的大小,矩阵的存储地址等;另外一个是矩阵,里面包含了图片的每一个像素值。

         明白了Mat有两部分组成后,能够更好的理解Mat的赋值。看下面的一段代码

#include<iostream>

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

 

using namespace cv;

 

int main()

{

    Mat A, C;                                 // 声明其实只是创建了header部分

    A = imread("zh.png", CV_LOAD_IMAGE_COLOR); // 这里,A的matrix部分指向了一个矩阵

 

    Mat B(A);                                 // 使用构造方法赋值,其实只有header部分复制了,

                                                //但是matrix复制的是地址空间,指向的是同一片区域

 

    C = A;                                    // 同理,header部分复制了,但是matrix指向同一片区域

    //A = A * 0;  //只是改变了A,但是三幅图都变了

    imshow("A", A); //显示的三幅图片都是同一片区域

    imshow("B", B);

    imshow("C", C);

    waitKey();

    return 0;

}

         上面的A,B,C的header只是值相同,但是每一个Mat都有自己的header,但是matrix不一样,他们不仅仅值相同,并且指向相同的地址空间。

         现在你可能会疑惑,如果三个Mat的matrix都是同一片地址空间,那么当它不再需要的时候,由谁来清除它。其实由最后一个使用它的那个Mat来清除,这里面涉及的引用计数问题,和C++的引用计数应该是相似的。

         如果我们需要一个和原来矩阵值一样,但是原来Mat的改变不会影响新的Mat。解决这个,openCV提供了clone() 和copyTo() 这两个函数。

    Mat F = A.clone();

    Mat G;

A. copyTo(G);

         上面的G和F,现在的值和A一样,但是A的改变不会影响到他们。

存储的方式:

         就是如何存储像素值,最简单的方式是用灰度矩阵来存储,前提是我们的图片是黑白的时候,当然还有一些其它的图片存储方式,比如常见的RGB。

显示的创建Mat:

可以使用imwrite()将图片写出,也可以使用<<操作符。看下面的一段程序

 

         Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255));

    std::cout << "M = " << std::endl<< ""<< M << std::endl << std::endl;

    system("pause");//让程序不闪退

 

         Mat的构造函数,前两个参数(这里都是2)指定Mat的大小,行与列数。

定义“CV_8UC3”的格式一般是这样的

CV_[The number of bits per item][Signed orUnsigned][Type Prefix]C[The channel number]

例如,CV_8UC3意思是我们用8 bitunsigned值表示单个数值,每个像素有3个数值来形成3个channel。

 bubuko.com,布布扣

使用create()函数创建。

        

    Mat M;

    M.create(4, 4, CV_8UC(2)); //参数的含义前面已经介绍了

    cout << "M = " << endl<< ""<< M << endl << endl;

 bubuko.com,布布扣

 

Matlab风格,使用zeros(),ones(),eye(),

         Mat E = Mat::eye(4, 4, CV_64F);

    cout << "E = " << endl<< ""<< E << endl << endl;

 

    Mat O = Mat::ones(2, 2, CV_32F);

    cout << "O = " << endl<< ""<< O << endl << endl;

 

    Mat Z = Mat::zeros(3, 3, CV_8UC1);

    cout << "Z = " << endl<< ""<< Z << endl << endl;

 bubuko.com,布布扣

小矩阵,可以用这种方式初始化:

    Mat C = (Mat_<double>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

    cout << "C = " << endl<< ""<< C << endl << endl;

 bubuko.com,布布扣

可以使用randu()函数,随机化一个矩阵,需要给定一个随机的上下界

    Mat R = Mat(3, 2, CV_8UC3);

    randu(R, Scalar::all(0), Scalar::all(255)); //0至255的值

    cout << "R = " << endl<< ""<< R << endl << endl;

        bubuko.com,布布扣

 

 

 

 

 

 

 

 

 

 

OpenCV 矩阵—图像的基本,布布扣,bubuko.com

OpenCV 矩阵—图像的基本

标签:opencv   mat   矩阵   

原文地址:http://blog.csdn.net/zhonghuan1992/article/details/38377819

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!