OpenCV 矩阵:图像的根基
当前位置:以往代写 > C/C++ 教程 >OpenCV 矩阵:图像的根基
2019-06-13

OpenCV 矩阵:图像的根基

OpenCV 矩阵:图像的根基

副标题#e#

我们有许多方法可以从现实糊口中获得图片,数码相机,扫描仪,可能我们险些人手有一部的手机。然而,当糊口中的图在数字设备上存储的时候,一幅图片被分成了许多许多的像素点,像素点就像拼图的时候的碎片,一个个碎片来组成一副图。而每个像素点都是由一个0-255的数字值来暗示。在openCV中,一个图片被许多像素点暗示,这些暗示像素点的值组成了一个矩阵。

OpenCV 矩阵:图像的根本

上面的图中,由暗示像素点的值组成了矩阵,在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。


#p#副标题#e#

显示的建设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。

OpenCV 矩阵:图像的根本

利用create()函数建设。    

Mat M;  
M.create(4, 4, CV_8UC(2)); //参数的寄义前面已经先容了  
cout << "M = " << endl<< ""<< M << endl << endl;

OpenCV 矩阵:图像的根本

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;

OpenCV 矩阵:图像的根本

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

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

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

OpenCV 矩阵:图像的根本

#p#分页标题#e#

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

Mat R = Mat(3, 2, CV_8UC3);  
randu(R, Scalar::all(0),Scalar::all(255)); //0至255的值  
cout << "R = " << endl<< ""<< R << endl << endl;

OpenCV 矩阵:图像的根本

作者:csdn博客 钟桓

    关键字:

在线提交作业