opencv_c++学习(十二)

一、ROI区域截取

Range(int _start,  int _end)

start:区间的起始(包含此范围)。
end:区间的结束(不包含此范围)。

Rect_(_Tp_x,_Tp _y_Tp _width,_Tp _height)

_Tp:数据类型,C++模板特性,可以用int、double、float等替换。
_x:矩形区域左上角第一个像素的x坐标,也就是第一个像素的列数。
_y:矩形区域左上角第一个像素的y坐标,也就是第一个像素的行数。
_width:矩形的宽,单位为像素,即矩形区域跨越的列数。
_height:矩形的高,单位为像素,即矩形区域跨越的行数。

二、图像的深拷贝与浅拷贝

这里的深拷贝和浅拷贝与我们往常提的相同。
深拷贝:

copy To(lnputArray src, OutputArray dst, InputArray mask)

src:待拷贝图像。
dst:深拷贝后的图像。
mask:深拷贝时的掩码矩阵。

copyTo(OutputArray m, lnputArray mask) const

m:深拷贝后的图像。
mask:深拷贝时的掩码矩阵。

二、高斯图像金字塔

在这里插入图片描述
上图为高斯图像金字塔。

金字塔下采样接口如下:

pyrDown(InputArray src, outputArray dst, const Size & dstsize = size(), int borderType = BORDER_DEFAULT)

src:输入待下采样的图像。
dst:输出下采样后的图像,图像尺寸可以指定,但是数据类型和通道数与src相同。
dstsize:输出图像尺寸,可以缺省。
borderType:像素边界外推方法的标志。(用什么方法对空余的边界进行填充)
高斯金字塔的使用案例如下:

	Mat src = imread("图片1.png");

	//定义一个高斯金字塔的向量
	vector<Mat> Guess;

	//定义高斯金字塔的层数
	int level = 3;

	//将原图放入到高斯金字塔第一层中
	Guess.push_back(src);

	//使用for循环对高斯金字塔进行下采样
	for (int i = 0; i < 3; i++)
	{	
		//存放下采样之后的金字塔变量
		Mat guess;

		//取出高斯金字塔前一层的向量,在进行下采样操作
		pyrDown(Guess[i], guess);

		//下采样之后的图像放入高斯金字塔的向量数据中
		Guess.push_back(guess);
	}

	//循环读取不同层的图像
	for (int i = 0; i < 3; i++)

	{	//将层数转化为字符串类型
		string name = to_string(i);

		//显示每一层的数据
		imshow(name, Guess[i]);
	}

	waitKey(0);
	return 0;

三、拉普拉斯图像金字塔

在这里插入图片描述

pyrUp(lnputArray src, OutputArray dst. const Size & dstsize = size(), int borderType = BORDER_DEFAULT

src:输入待上采样的图像。
dst:输出上采样后的图像,图像尺寸可以指定,但是数据类型和通道数与src相同,
dstsize:输出图像尺寸,可以缺省。
borderType:像素边界外推方法的标志。
样例代码如下:

	Mat src = imread("1.jpg");

	//定义一个高斯金字塔的向量
	vector<Mat> Guess;

	//定义高斯金字塔的层数
	int level = 3;

	//将原图放入到高斯金字塔第一层中
	Guess.push_back(src);

	//使用for循环对高斯金字塔进行下采样
	for (int i = 0; i < level; i++)
	{	
		//存放下采样之后的金字塔变量
		Mat guess;

		//取出高斯金字塔前一层的向量,在进行下采样操作
		pyrDown(Guess[i], guess);

		//下采样之后的图像放入高斯金字塔的向量数据中
		Guess.push_back(guess);
	}

	vector<Mat> Lap;
	for (int i = Guess.size()-1; i > 0; i--)
	{
	//	//定义每层高斯金字塔的图像、放大后的高斯金字塔图像
		Mat lap, upGuess;

		//如果读入的图像是高斯金字塔中的最大的图像,则先下采样
		if (i == Guess.size() - 1)
		{
			//对最顶端的图像进行下采样
			Mat down;
			pyrDown(Guess[i], down);
			//在对下采样之后的图像上采样
			pyrUp(down, upGuess);
			cout << Guess[i].size() << endl;
			cout << upGuess.size() << endl;
			lap = Guess[i] - upGuess;

		//	//存入拉普拉斯金字塔的向量中
			Lap.push_back(lap);
		}

		//如果为其他层,则先上采样,在与下一层的特征相减
		pyrUp(Guess[i], upGuess);
		lap = Guess[i - 1] - upGuess;
		//存入拉普拉斯金字塔的向量中
		Lap.push_back(lap);
	}

	//循环读取不同层的图像
	for (int i = 0; i < Guess.size(); i++)

	{
		//将层数转化为字符串类型
		string name = to_string(i);

		//显示每一层的数据
		imshow("G" + name, Guess[i]);
		imshow("L" + name, Lap[Guess.size() - 1 - i]);
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值