OpenCV 学习笔记-day3(Mat对象与创建相关操作Mat::clone(),Mat::copyTo(),Mat::zeros(),Mat::ones(),Scalar()...)

day3-Mat对象与创建

Mat类的基本操作

Mat类的成员函数:Mat::clone(),Mat::copyTo(),Mat::zeros(),Mat::ones(),Scalar()

一 ,拷贝

函数:

  1. “=” 浅拷贝

浅拷贝 - 不复制数据只创建矩阵头,数据共享

例1

Mat a = imread("1.jpg");
  1. Mat::clone

clone 是完全的深拷贝,在内存中申请新的空间

//定义
Mat Mat::clone() const
{
    Mat m;
    copyTo(m);
    return m;
}

例2

Mat m1 = image.clone();
//clone 是完全的深拷贝,在内存中申请新的空间,与image独立
  1. Mat::copyTo
//定义
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中

二,创建空白图像

函数:

  1. Mat::zeros() 返回指定大小和类型的零数组
    Mat::ones() 返回指定大小和类型全为1的数组
//定义
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通道
  1. Mat::cols 行数
    Mat::rows 列数
    Mat::channels 通道数

例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
初始化为1单通道
显示结果4-只能初始化第一通道
初始化为1 3通道 错误

三 ,赋值操作

函数:

  1. Scalar() 给三个通道赋值
//定义
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–只有第一个通道被赋值
赋值给8位无符号3通道,只有第一个通道被赋值

结果6.1–使用Scalar(),3个通道都赋值
3个通道都赋值
结果6.2–300*300 3通道的灰度图像
300*300 3通道的灰度图像
显示结果7.1
红
显示结果7.2
绿
显示结果7.3
蓝
显示结果8
m4

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值