OpenCV 矩阵—图像的基本

OpenCV  矩阵—图像的基本

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

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

使用create()函数创建。

Mat M;

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

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

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;

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

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

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

可以使用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 矩阵—图像的基本

时间: 2024-06-12 13:33:05

OpenCV 矩阵—图像的基本的相关文章

OpenCV &mdash;&mdash; 矩阵和图像操作

cvAbs , cvAbsDiff , cvAbsDiffS cvAdd , cvAddS , cvAddWeighted(可添加权重) #include <cv.h> #include <highgui.h> int main(int argc,char** argv) { IplImage *s1,*s2; s1=cvLoadImage("wukong.jpg",CV_LOAD_IMAGE_COLOR); s2=cvLoadImage("test.

OpenCV中图像的结构和区别

在OpenCV中,现在有很多种结构类型可以用来表示图像,它们之间有区别又有联系,现在记录一下它们之间的区别和相似之处,以便后面查看. 其中类型有: 1. Iplimage,2. Mat,3.CvMat, 4.CVArr: 其中: 1. IplImage: 较老版本的图像存储类型,在2.0之前使用: 2. CvArr: 也是较老的一种存储结构,是一种抽象的基类. 3. CvMat: 矩阵结构. 4. Mat:  新版本中使用的,推荐使用,是一个图像容器,基本上讲 Mat 是一个类,由两个数据部分组

OpenCV常用图像操作和鼠标操作

最近的工作经常需要对图像进行操作,也需要用鼠标对图像进行各种操作,于是自己整理和编写了这个类,总结了常用的基于OpenCV对图像进行的操作. 这个类我也将继续完善和丰富下去,需要的朋友可以直接使用. 如果有什么疏漏的地方还请多多指教. 首先是头文件: /* ******* ccv.h ********** ********* opencv常用操作函数声明 ********** */ /* author: autumoon */ #ifndef _CCV_H_ #define _CCV_H_ #i

Opencv中图像的遍历与像素操作

Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0代表黑,255代表白):对于彩色图像,每个像素是一个三元向量,即由三个8位无符号数来表示三个颜色通道(Opencv中顺次为蓝.绿.红). 我们先来介绍下cv::Mat类的获取像素的成员函数at(),其函数原型如下: template<typename _Tp> _Tp& at(int i0

opencv对图像进行边缘及角点检测

opencv对图像进行边缘及角点检测 先看结果: 代码: // ConsoleApplication1_812.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "opencv2/opencv.hpp" class Imagedetector{ public: Imagedetector():threshold(-1) ,cross(5

OpenCV &mdash;&mdash; 矩阵操作

多通道的矩阵 -- 通道是连续的!! 要将指向该数据类型的指针移动到下一通道,我们只需要将其增加1.如果想访问下一个"像素"或者元素集,则需要一定的偏移量 矩阵的step元素是矩阵中行的长度,单位为字节.   #include "cv.h" #include "highgui.h" #include <IOSTREAM.H> int main(int argc,char** argv) { float vals[]={0.85,-0.

用opencv读取图像鼠标点的像素,更正一个Bug

作者:skyseraph 出处:http://www.cnblogs.com/skyseraph/ 以下代码在网上流传很广. 不过,调试运行之后发现,功能是正确的,但是内存很快就耗尽,导致死机.经过查找,加上: cvReleaseImage(&img1);    //释放源图像占用的内存 这一行是我(szliug)加的,否则内存很快就会耗尽,会死机的. 之后运行正常. /*===============================================// 功能:OpenCV Ut

实验2014062701:opencv对图像的点操作

#include<Windows.h>#include<cv.h>#include<highgui.h>#include <cxcore.h>int main(){    IplImage* img = cvLoadImage("1.jpg");    IplImage* dst = cvCreateImage(cvGetSize(img),img->depth,1);    cvNamedWindow("GRAY&quo

OpenCV中图像算术操作与逻辑操作

OpenCV中图像算术操作与逻辑操作 在图像处理中有两类最重要的基础操作分别是图像点操作与块操作,简单点说图像点操作就是图像每个像素点的相关逻辑与几何运算.块操作最常见就是基于卷积算子的各种操作.实现各种不同的功能.今天小编就跟大家一起学习OpenCV中图像点操作相关的函数与应用场景.常见算术运算包括加.减.乘.除,逻辑运算包括与.或.非.异或.准备工作: 选择两张大小一致的图像如下.加载成功以后显示如下: 加法操作结果如下: 减法操作结果如下: 乘法操作结果如下: 除法操作结果如下: 权重加法