OpenCV 学习笔记
day3-Mat对象与创建
Mat类的基本操作
Mat类的成员函数:Mat::clone(),Mat::copyTo(),Mat::zeros(),Mat::ones(),Scalar()
一 ,拷贝
函数:
浅拷贝 - 不复制数据只创建矩阵头,数据共享
例1
Mat a = imread("1.jpg");
clone 是完全的深拷贝,在内存中申请新的空间
//定义
Mat Mat::clone() const
{
Mat m;
copyTo(m);
return m;
}
例2
Mat m1 = image.clone();
//clone 是完全的深拷贝,在内存中申请新的空间,与image独立
//定义
void GpuMat::copyTo(OutputArray dst, InputArray mask) const
{
copyTo(dst, mask, Stream::Null());
}
OpenCV中image.copyTo()有两种形式:
1、image.copyTo(imageROI),作用是把image的内容粘贴到imageROI;
2、image.copyTo(imageROI,mask),作用是把mask和image重叠以后把mask中像素值为0(black)的点对应的image中的点变为透明,而保留其他点。
mask:即掩模。掩模是由0和1组成的一个二进制图像。当在某一功能中应用掩模时,1值区域被处理,被屏蔽的0值区域不被包括在计算中。通过指定的数据值、数据范围、有限或无限值、感兴趣区和注释文件来定义图像掩模,也可以应用上述选项的任意组合作为输入来建立掩模。
例3
image.copyTo(m2);//把image的内容拷贝到m2中
二,创建空白图像
函数:
//定义
static MatExpr zeros(Size size, int type);
static MatExpr ones(Size size, int type);
type可以是任何的预定义类型,预定义类型的结构如下所示:
CV_<bit_depth>(S|U|F)C<number_of_channels>
1)bit_depth—比特数—代表8bite,16bites,32bites,64bites—举个例子吧–比如说,如
如果你现在创建了一个存储–灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位–所以它对应的就是CV_8
2)S|U|F
S–代表—signed int—有符号整形
U–代表–unsigned int–无符号整形
F–代表–float---------单精度浮点型
3)C<number_of_channels>
代表—一张图片的通道数,比如:
1–灰度图片–grayImg—是–单通道图像
2–RGB彩色图像---------是–3通道图像
3–带Alph通道的RGB图像–是--4通道图像
例4
Mat m3 = Mat::zeros(Size(8, 8), CV_8UC1);
//创建矩阵;CV_8UC1八位无符号单通道 CV_8UC1单通道
//初始化为1 此时只能选择使用单通道
//if使用3通道看下面完整结果会有错误-只有第一通道初始化为1
Mat m3 = Mat::ones(Size(8, 8), CV_8UC1);//8*8 8位无符号单通道
//初始化为1,使用3通道
Mat m3 = Mat::ones(Size(8, 8), CV_8UC3);//8*8 8位无符号3通道
例5
std::cout << "width: " << m3.cols << std::endl;//输出宽度
std::cout << "height: " <<m3.rows << std::endl;//输出宽度
std::cout << "channels: " << m3.channels()<< std::endl;//输出通道数
代码
quickopencv.h
#pragma once
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
using namespace cv;
//定义类
class QuickDemo{
public:
void colorSpace_Demo(Mat &image);//色彩空间转换函数2021-12-24
void mat_creation_demo(Mat &image);//Mat对象与创建2021-12-27
};
OpencvTest.cpp
#include <iostream>
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
#include<quickopencv.h>
using namespace cv;
using namespace std;
int main()
{
Mat scr = imread("D:\\学习\\OpenCV学习\\pictures\\image\\1.jpg");//打开一张图
if (!scr.data == 1)//判空
return -1;
namedWindow("窗口1", WINDOW_NORMAL);//创建 WINDOW_FREERATIO窗口
imshow("窗口1",scr);//在创建的窗口显示
QuickDemo qd;
//qd.colorSpace_Demo(scr);//色彩转换
//waitKey(0);//延时 0->一直延时 1->延时1ms
qd.mat_creation_demo(scr);//Mat类的相关操作
waitKey(0);
return 0;
QuickDemo.cpp
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
#include<quickopencv.h>
#include <iostream>
// 函数名称:void QuickDemo::mat_creation_demo(Mat &image)
// 功能说明:Mat对象与创建
// 参数说明:Mat &image
// 函数返回:无
// 修改时间:2021年12月29日
// 备 注:
void QuickDemo::mat_creation_demo(Mat &image)
{
//创建空白图像
//8*8 8位无符号1通道 全部初始化为0
Mat m3 = Mat::zeros(Size(8, 8), CV_8UC1);//矩阵;size:8*8 CV_8UC1:八位无符号单通道 初始化为0---显示结果1
//Mat m3 = Mat::zeros(Size(8, 8), CV_8UC3);//CV_8UC3八位无符号3通道--显示结果2
//初始化为1 此时只能选择使用单通道 if使用3通道看以下结果会有错误
//Mat m3 = Mat::ones(Size(8, 8), CV_8UC1);//szie:8*8 CV_8UC1:8位无符号单通道 初始化为0--显示结果3
//Mat m3 = Mat::ones(Size(8, 8), CV_8UC3);//size:8*8 CV_8UC3:8位无符号3通道 初始化为1--显示结果4 只能初始化第一通道
std::cout << "width: " << m3.cols << std::endl;//输出宽度
std::cout << "height: " <<m3.rows << std::endl;//输出宽度
std::cout << "channels: " << m3.channels()<< std::endl;//输出通道数
std::cout << m3 << std::endl;//输出m3
}
显示结果1
显示结果2
显示结果3
显示结果4-只能初始化第一通道
三 ,赋值操作
函数:
//定义
Scalar_<_Tp>::Scalar_(_Tp v0, _Tp v1, _Tp v2, _Tp v3)
{
this->val[0] = v0;
this->val[1] = v1;
this->val[2] = v2;
this->val[3] = v3;
}
例6
m4 = Scalar(127,127,127);//给3个通道都赋值 灰度图
//127为灰度值
m4 = Scalar(255, 0, 0);
//300*300 3通道的灰度(127,127,127),
//蓝色(255,0,0),绿色(0,255,0),黄色(0,0,255)
代码
quickopencv.h
#pragma once
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
using namespace cv;
//定义类
class QuickDemo{
public:
void colorSpace_Demo(Mat &image);//色彩空间转换函数2021-12-24
void mat_creation_demo(Mat &image);//Mat对象与创建2021-12-27
};
OpencvTest.cpp
#include <iostream>
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
#include<quickopencv.h>
using namespace cv;
using namespace std;
int main()
{
Mat scr = imread("D:\\学习\\OpenCV学习\\pictures\\image\\1.jpg");//打开一张图
if (!scr.data == 1)//判空
return -1;
namedWindow("窗口1", WINDOW_NORMAL);//创建 WINDOW_FREERATIO窗口
imshow("窗口1",scr);//在创建的窗口显示
QuickDemo qd;
//qd.colorSpace_Demo(scr);//色彩转换
//waitKey(0);//延时 0->一直延时 1->延时1ms
qd.mat_creation_demo(scr);//Mat类的相关操作
waitKey(0);
return 0;
QuickDemo.cpp
void QuickDemo::mat_creation_demo(Mat &image)
{
//赋值操作
Mat m4=Mat::zeros(Size(300,300),CV_8UC3);
//m4 = 127;//此时只能给第一个通道赋值 127为灰度
//--显示结果5
//Scalar()函数
m4 = Scalar(127,127,127);//给3个通道都赋值 灰度图--结果6
//m4 = Scalar(255, 0, 0);//300*300 3通道的灰度(127,127,127),蓝色(255,0,0),绿色(0,255,0),黄色(0,0,255)--显示结果7
imshow("m4", m4);//可以用imshow输出显示
//Mat m5 = m4;//m5指向了m4 //***
//m5 = Scalar(0, 255, 255);//此时修改了m4的颜色为黄色
//imshow("m4",m4);//m4输出显示为黄色--显示结果8
std::cout << "width: " << m4.cols << std::endl;//输出宽度
std::cout << "height: " <<m4.rows << std::endl;//输出宽度
std::cout << "channels: " << m4.channels()<< std::endl;//输出通道数
std::cout << m4 << std::endl;//输出m
}
结果5–只有第一个通道被赋值
结果6.1–使用Scalar(),3个通道都赋值
结果6.2–300*300 3通道的灰度图像
显示结果7.1
显示结果7.2
显示结果7.3
显示结果8