opencv基础知识学习 -- 代码练习二

9 篇文章 0 订阅

示例一:// 图像像素的算术操作

void CV120201012Dlg::pixelOperator()
{
	Mat m1 = imread("E:\\壁纸\\微信图片_20200610160556.jpg");
	// 定义变量接收操作之后的图像
	Mat img;
	img = m1 + Scalar(50,50,50);  // - / 都可以, * 需要使用opencv 的 API 函数
	/*namedWindow("图像像素算术操作", WINDOW_AUTOSIZE);
	imshow("图像像素算术操作",img);*/

	// 两幅图像相乘
	Mat m2 = Mat::zeros(m1.size(),m1.type());
	m2 = Scalar(2,2,2);
	// 乘法  
	multiply(m1,m2,img);
	namedWindow("图像像素算术操作 乘法", WINDOW_AUTOSIZE);
	imshow("图像像素算术操作 乘法", img);
	// 除法
	divide(m1, m2, img);
	namedWindow("图像像素算术操作 除法", WINDOW_AUTOSIZE);
	imshow("图像像素算术操作 除法", img);
	m2 = Scalar(59, 50, 52);  // 为使得效果更明显 加大数值
	// 减法
	subtract(m1, m2, img);
	namedWindow("图像像素算术操作 减法", WINDOW_AUTOSIZE);
	imshow("图像像素算术操作 减法", img);
	// 加法
	add(m1, m2, img);
	namedWindow("图像像素算术操作 加法", WINDOW_AUTOSIZE);
	imshow("图像像素算术操作 加法", img);
	
	
	/*
		saturate_cast<uchar>();
		可防止 ()中的运算 溢出, <0时 =0   >255时=255
	*/

	waitKey(0);
}

 示例二:滚动条练习  使用滚动条改变图像亮度

static void onTrack(int b,void*)
{
    // 对图像进行 算术操作
	Mat m1 = imread("E:\\壁纸\\微信图片_20200610160556.jpg");
	Mat m2 = Mat::zeros(m1.size(), m1.type());
	m2 = Scalar(b, b, b);
	// 定义变量接收操作之后的图像
	Mat img;
	// 加法
	add(m1, m2, img);
	namedWindow("滚动条", WINDOW_AUTOSIZE);
	imshow("滚动条", img);
	//waitKey(0);   // 不能添加,添加后滚动条的数据显示不会更新
}
void CV120201012Dlg::trackingBar()
{
	// 定义一个窗口用来显示图像和滚动条
	namedWindow("滚动条", WINDOW_NORMAL);
	// 定义一个滚动条
	int lightValue = 50;
	int maxValue = 100;
	createTrackbar("Value", "滚动条", &lightValue,maxValue,onTrack);
	onTrack(50,0);  // 如果不加这句话,运行后显示的是一幅灰图像,拖动滚动条才显示正常图像
}

 

示例三: 键盘响应操作

void CV120201012Dlg::keyboardDemo()
{
	// 定义一个变量来接收键盘按下的值
	
	Mat m = imread("E:\\壁纸\\微信图片_20200610160556.jpg");
	if (m.empty())
	{
		MessageBox(_T("图像加载失败!"), _T("error"));
		return;
	}
	Mat img = m.clone();
	while (1)
	{
		int key = waitKey(100);
		if (key == 27)
		{
			break;
		}
		else if (key == 49)
		{
			cvtColor(m,img,COLOR_BGR2GRAY);
		}
		else if (key == 50)
		{
			cvtColor(m, img, COLOR_BGR2HSV);
		}
		else if (key == 51)
		{
			m = m + Scalar(50,50,50);
			img = m.clone();
		}
		namedWindow("键盘响应", WINDOW_NORMAL);
		imshow("键盘响应", img);
	}
}

示例四:颜色图

void CV120201012Dlg::colorMap()
{
	// 读取一张图像
	Mat m = imread("E:\\壁纸\\微信图片_20200610160556.jpg");
	Mat img = Mat::zeros(m.size(),m.type());
	// 定义颜色表数组
	int m_colorMap[] = {
		COLORMAP_AUTUMN , //!< ![autumn](pics/colormaps/colorscale_autumn.jpg)
	COLORMAP_BONE , //!< ![bone](pics/colormaps/colorscale_bone.jpg)
	COLORMAP_JET , //!< ![jet](pics/colormaps/colorscale_jet.jpg)
	COLORMAP_WINTER , //!< ![winter](pics/colormaps/colorscale_winter.jpg)
	COLORMAP_RAINBOW, //!< ![rainbow](pics/colormaps/colorscale_rainbow.jpg)
	COLORMAP_OCEAN , //!< ![ocean](pics/colormaps/colorscale_ocean.jpg)
	COLORMAP_SUMMER , //!< ![summer](pics/colormaps/colorscale_summer.jpg)
	COLORMAP_SPRING , //!< ![spring](pics/colormaps/colorscale_spring.jpg)
	COLORMAP_COOL , //!< ![cool](pics/colormaps/colorscale_cool.jpg)
	COLORMAP_HSV , //!< ![HSV](pics/colormaps/colorscale_hsv.jpg)
	COLORMAP_PINK , //!< ![pink](pics/colormaps/colorscale_pink.jpg)
	COLORMAP_HOT , //!< ![hot](pics/colormaps/colorscale_hot.jpg)
	COLORMAP_PARULA , //!< ![parula](pics/colormaps/colorscale_parula.jpg)
	COLORMAP_MAGMA , //!< ![magma](pics/colormaps/colorscale_magma.jpg)
	COLORMAP_INFERNO , //!< ![inferno](pics/colormaps/colorscale_inferno.jpg)
	COLORMAP_PLASMA , //!< ![plasma](pics/colormaps/colorscale_plasma.jpg)
	COLORMAP_VIRIDIS , //!< ![viridis](pics/colormaps/colorscale_viridis.jpg)
	COLORMAP_CIVIDIS , //!< ![cividis](pics/colormaps/colorscale_cividis.jpg)
	COLORMAP_TWILIGHT , //!< ![twilight](pics/colormaps/colorscale_twilight.jpg)
	COLORMAP_TWILIGHT_SHIFTED , //!< ![twilight shifted](pics/colormaps/colorscale_twilight_shifted.jpg)
	COLORMAP_TURBO  , //!< ![turbo](pics/colormaps/colorscale_turbo.jpg)
	COLORMAP_DEEPGREEN   //!< ![deepgreen](pics/colormaps/colorscale_deepgreen.jpg)
	};
	if (m.empty())
	{
		MessageBox(_T("图像加载失败!"), _T("error"));
		return;
	}
	int index = 0;
	while (1)   // 循环显示
	{
		int key = waitKey(1000);  // 2 s一刷新
		if (key == 27)
		{
			break;
		}
		
		applyColorMap(m,img, m_colorMap[index%21]);
		index++;

		namedWindow("颜色表", WINDOW_NORMAL);
		imshow("颜色表", img);
		if (key == 83 || key == 115)  // 按下 s 键  保存当前图像
		{
			std::stringstream filename;
			filename << "E:\\壁纸\\colorMap\\" << index <<"--"<< m_colorMap [index%21]<< ".jpg";
			imwrite(filename.str(),img);
		}
	}
}

示例5:图像位操作

void CV120201012Dlg::bitwiseDemo()
{
    // 创建俩张图像
	Mat m1 = Mat::zeros(Size(255,255),CV_8UC3);
	Mat m2 = Mat::zeros(Size(255, 255), CV_8UC3);
	// 使用 rectangle 来绘制图像
	rectangle(m1,Rect(150,150,80,80),Scalar(255,255,0),-1,LINE_8,0);
	rectangle(m2, Rect(200, 200, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);  // -1 填充 >0 绘制(描边)

	// 运算
	Mat img;
	bitwise_and(m1,m2,img);
	imshow("与运算", img);
	bitwise_or(m1, m2, img);
	imshow("或运算", img);
	bitwise_xor(m1, m2, img);
	imshow("异或运算", img);
	bitwise_not(m2, img);
	imshow("非运算", img);

}

示例六:通道混合

void CV120201012Dlg::channelDemo()
{
	Mat m = imread("E:\\壁纸\\周震南\\微信图片_20200610160556.jpg");
	if (m.empty())
	{
		MessageBox(_T("图像加载失败!"), _T("error"));
		return;
	}
	//分离通道
	// 接收分离后通道的数组
	std::vector<Mat> chan;
	split(m,chan);

	imshow("蓝色B", chan[0]);
	imshow("绿色G", chan[1]);
	imshow("红色R", chan[2]);

	//  通道混合
	int chanArry[] = {1,2,0,1,2,2};
	mixChannels(m,m1, chanArry,3);

	imshow("通道混合", m1);

}

 

涉及到的相关opencv函数,详解请参见https://blog.csdn.net/L946494/article/details/109170017

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值