OpenCV(C++版本)基础相关(4):通道的分离与合并、图像色彩空间转换、图像像素值统计、图像几何形状的绘制、随机数与随机颜色


知识来源:哔哩哔哩。以下内容仅为学习笔记,不做其他用途。

续前节OpenCV(C++版本)基础相关(3):滚动条操作、滚动条-传递参数、键盘响应操作、自带颜色操作、图像像素的逻辑操作

十一、通道的分离与合并

知识点:

  • split(image, mv);//通道分离。image图片,mv要拆分的单通道。
  • merge(mv, dst);//通道合并。mv要合并的通道,dst图片。
  • mixChannels(&image, 1, &dst, 1, from_to, 3);//图像通道处理有关的一个函数,能够实现复杂通道的组合。image输入矩阵;1输入矩阵数量;dst输出矩阵;1输出矩阵数量;被复制通道与要复制到的位置组成的索引对;3表示fromTo中索引对的数目,即3个通道。

11.1 quickopencv.h

#include<opencv2/opencv.hpp>
using namespace cv;

class QuickDemo //QuickDemo对象
{
public:
	void channels_demo(Mat &imge);
};

11.2 QuickDemo.cpp

#include<quickopencv.h>
#include<iostream>


void QuickDemo::channels_demo(Mat &image)
{
	std::vector<Mat>mv;
	split(image, mv);
	//imshow("蓝色", mv[0]);
	//imshow("绿色", mv[1]);
	//imshow("红色", mv[2]);
	Mat dst;
	mv[1] = 0;
	mv[2] = 0;
	merge(mv, dst);

	namedWindow("蓝色", WINDOW_KEEPRATIO);
	imshow("蓝色", dst);					//在窗口显示图像
	resizeWindow("蓝色", 320, 480);

	int from_to[] = {0,2,1,1,2,0 };
	mixChannels(&image, 1, &dst, 1, from_to, 3);//3表示3个通道

	namedWindow("通道混合", WINDOW_KEEPRATIO);
	imshow("通道混合", dst);					//在窗口显示图像
	resizeWindow("通道混合", 320, 480);

}

11.3 test.cpp

#include<opencv2/opencv.hpp>
#include<iostream>
#include<quickopencv.h>

using namespace std;
using namespace cv;
int main(int argc,char **argv)
{

	Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
	
	if (src.empty())
	{
		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
		return -1;
	}
	
	namedWindow("输入窗口", WINDOW_KEEPRATIO);	
	imshow("输入窗口", src);					//在窗口显示图像
	resizeWindow("输入窗口", 320, 480);
	QuickDemo qd;								//调用之前创建的类对象	
	qd.channels_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

在这里插入图片描述

十二、图像色彩空间转换

知识点:

  • inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
    参数1:输入要处理的图像,可以为单通道或多通道。
    参数2:包含下边界的数组或标量。
    参数3:包含上边界数组或标量。
    参数4:输出图像,与输入图像src 尺寸相同且为CV_8U 类型。

12.1 quickopencv.h

#include<opencv2/opencv.hpp>
using namespace cv;

class QuickDemo //QuickDemo对象
{
public:
	void inrange_demo(Mat &imge);
};

12.2 QuickDemo.cpp

#include<quickopencv.h>
#include<iostream>


void QuickDemo::inrange_demo(Mat &image)
{
	Mat hsv;
	cvtColor(image, hsv, COLOR_BGR2HSV);
	Mat mask;
	inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);

	namedWindow("mask", WINDOW_KEEPRATIO);
	imshow("mask", hsv);					//在窗口显示图像
	resizeWindow("mask", 320, 480);

	//Mat redback = Mat::zeros(image.size(), image.type());
	//redback = Scalar(40, 40, 200);//
	//bitwise_not(mask, mask);

	//namedWindow("mask", WINDOW_KEEPRATIO);
	//imshow("mask", mask);					//在窗口显示图像
	//resizeWindow("mask", 320, 480);

	//image.copyTo(redback, mask);//把redback复制到mask,mask通过inRange得到。

	//namedWindow("roi区域提取", WINDOW_KEEPRATIO);
	//imshow("roi区域提取", redback);					//在窗口显示图像
	//resizeWindow("roi区域提取", 320, 480);
}


12.3 test.cpp

#include<opencv2/opencv.hpp>
#include<iostream>
#include<quickopencv.h>

using namespace std;
using namespace cv;
int main(int argc,char **argv)
{

	Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
	
	if (src.empty())
	{
		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
		return -1;
	}
	
	namedWindow("输入窗口", WINDOW_KEEPRATIO);	
	imshow("输入窗口", src);					//在窗口显示图像
	resizeWindow("输入窗口", 320, 480);
	QuickDemo qd;								//调用之前创建的类对象	
	qd.inrange_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

在这里插入图片描述

十三、图像像素值统计

知识点:

  • minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());//求出图像的最大值和最小值。
  • meanStdDev(image, mean, stddev);//求图像的均值和方差

13.1 quickopencv.h

#include<opencv2/opencv.hpp>
using namespace cv;

class QuickDemo //QuickDemo对象
{
public:
	void pixel_statistic_demo(Mat &imge);
};

13.2 QuickDemo.cpp

#include<quickopencv.h>
#include<iostream>


void QuickDemo::pixel_statistic_demo(Mat &image)
{
	double minv, maxv;//定义最小、最大值
	Point minLoc, maxLoc;//定义最小、最大值的地址
	std::vector<Mat>mv;//定义一个Mat类型的数组容器:mv
	split(image, mv);//对通道分割
	for (int i = 0; i < mv.size(); i++)
	{
		//遍历
		minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());//求出图像的最大值和最小值。
		std::cout << "No.channels:" << i << " minvalue:" << minv << " maxvalue:" << maxv << std::endl;//打印各个通道的数值
	}
	Mat mean, stddev;//定义均值和方差
	meanStdDev(image, mean, stddev);//求图像的均值和方差
	std::cout << "mean:" << mean << std::endl;//打印均值
	std::cout << "stddev:" << stddev << std::endl;//打印方差
}


13.3 test.cpp

#include<opencv2/opencv.hpp>
#include<iostream>
#include<quickopencv.h>

using namespace std;
using namespace cv;
int main(int argc,char **argv)
{

	Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
	
	if (src.empty())
	{
		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
		return -1;
	}
	
	namedWindow("输入窗口", WINDOW_KEEPRATIO);	
	imshow("输入窗口", src);					//在窗口显示图像
	resizeWindow("输入窗口", 320, 480);
	QuickDemo qd;								//调用之前创建的类对象	
	qd.pixel_statistic_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

在这里插入图片描述

十四、图像几何形状的绘制

知识点:

  • Rect rect;//定义一个对象rect,用来存储一个矩形框的左上角坐标、宽度和高度

  • rectangle(image, rect, Scalar(0, 0, 255), -1, 8, 0);//image代表待处理的图片,rect代表矩形坐标和宽高;Scalar(0, 0, 255)代表颜色;-1代表填充;8代表8连接;0为默认。

  • circle(bg, Point(350, 400), 15, Scalar(0, 255, 0), -1, 8, 0);//bg代表图像;Point(350, 400)代表圆心坐标;15半径;Scalar(0, 255, 0)代表颜色;-1为填充;8为领域填充;0为默认;

  • line(bg, Point(100, 100), Point(350, 400), Scalar(0, 0, 255), 8, LINE_AA, 0);//bg代表图像;Point(350, 400)代表起点坐标;Point(350, 400)为终点坐标;Scalar(0, 255, 0)代表颜色;LINE_AA为抗锯齿线。

  • RotatedRect rtt;//定义一个对象,用于存储旋转矩形。包括矩形中心,矩形长宽,旋转角度。

  • ellipse(bg, rtt, Scalar(0, 0, 255), 2, 8);//椭圆函数。

14.1 quickopencv.h

#include<opencv2/opencv.hpp>
using namespace cv;

class QuickDemo //QuickDemo对象
{
public:
	void drawing_demo(Mat &imge);
};

14.2 QuickDemo.cpp

#include<quickopencv.h>
#include<iostream>


void QuickDemo::drawing_demo(Mat &image)
{
	/*绘图演示1*/
	Rect rect;
	rect.x = 100;
	rect.y = 100;
	rect.width = 250;
	rect.height = 300;
	Mat bg = Mat::zeros(image.size(), image.type());
	rectangle(image, rect, Scalar(0, 0, 255), -1, 8, 0);
	circle(bg, Point(350, 400), 15, Scalar(0, 255, 0), -1, 8, 0);
	line(bg, Point(100, 100), Point(350, 400), Scalar(0, 0, 255), 8, LINE_AA, 0);
	Mat dst;
	addWeighted(image, 0.7, bg, 0.3, 0, dst);
	namedWindow("绘图演示1", WINDOW_KEEPRATIO);
	imshow("绘图演示1", dst);					//在窗口显示图像
	resizeWindow("绘图演示1", 320, 480);


	/*绘图演示2*/
	//Rect rect;
	//rect.x = 100;
	//rect.y = 100;
	//rect.width = 250;
	//rect.height = 300;
	//Mat bg = Mat::zeros(image.size(), image.type());
	//rectangle(image, rect, Scalar(0, 0, 255), -1, 8, 0);
	//circle(bg, Point(350, 400), 15, Scalar(0, 255, 0), -1, 8, 0);
	//line(bg, Point(100, 100), Point(350, 400), Scalar(0, 0, 255), 8, LINE_AA, 0);
	//RotatedRect rtt;
	//rtt.center = Point(200, 200);
	//rtt.size = Size(100, 200);
	//rtt.angle = 0.0;
	//line(bg, Point(100, 100), Point(350, 400), Scalar(0, 0, 255), 8, LINE_AA, 0);
	//ellipse(bg, rtt, Scalar(0, 0, 255), 2, 8);
	//Mat dst;
	//addWeighted(image, 0.7, bg, 0.3, 0, dst);
	//namedWindow("绘图演示2", WINDOW_KEEPRATIO);
	//imshow("绘图演示2", dst);					//在窗口显示图像
	//resizeWindow("绘图演示2", 320, 480);
	
}

14.3 test.cpp

#include<opencv2/opencv.hpp>
#include<iostream>
#include<quickopencv.h>

using namespace std;
using namespace cv;

int main(int argc,char **argv)
{

	Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
	
	if (src.empty())
	{
		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
		return -1;
	}
	
	namedWindow("输入窗口", WINDOW_KEEPRATIO);	
	imshow("输入窗口", src);					//在窗口显示图像
	resizeWindow("输入窗口", 320, 480);
	QuickDemo qd;								//调用之前创建的类对象	
	qd.drawing_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

在这里插入图片描述

在这里插入图片描述

十五、随机数与随机颜色

知识点:

  • RNG rng(12345);//RNG为随机生成函数,用于产生随机数,12345为随机种子。对于一个伪随机数生成器,从相同的随机数种子出发,可以得到相同的随机数序列。
  • int b = rng.uniform(0, 255);//在(0,255)区间,随机生成一个整数

15.1 quickopencv.h

#include<opencv2/opencv.hpp>
using namespace cv;

class QuickDemo //QuickDemo对象
{
public:
	void random_drawing();
};

15.2 QuickDemo.cpp

#include<quickopencv.h>
#include<iostream>


void QuickDemo::random_drawing()
{
	Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);//创建底图画布
	int w = canvas.cols;
	int h = canvas.rows;
	RNG rng(12345);//产生随机数
	while (true)
	{
		int c = waitKey(10);
		if (c == 27)
		{
			break;//退出
		}
		int x1 = rng.uniform(0, canvas.cols);//坐标点1
		int y1 = rng.uniform(0, h);
		int x2 = rng.uniform(0, canvas.cols);// 坐标点2
		int y2 = rng.uniform(0, h); 
		int b = rng.uniform(0, 255);// 随机颜色
		int g = rng.uniform(0, 255);
		int r = rng.uniform(0, 255);
		//canvas = Scalar(0, 0, 0);//每次清零
		line(canvas, Point(x1, y1), Point(x2, y2), Scalar(b, g, r), 1, LINE_AA, 0);//绘制线段	
		imshow("随机绘制演示", canvas);
	}
}


15.3 test.cpp

#include<opencv2/opencv.hpp>
#include<iostream>
#include<quickopencv.h>

using namespace std;
using namespace cv;

int main(int argc,char **argv)
{

	Mat src = imread("D:/opencv/pictures/11 (8).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
	
	if (src.empty())
	{
		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
		return -1;
	}
	
	namedWindow("输入窗口", WINDOW_KEEPRATIO);	
	imshow("输入窗口", src);					//在窗口显示图像
	resizeWindow("输入窗口", 320, 480);
	QuickDemo qd;								//调用之前创建的类对象	
	qd.random_drawing();
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值