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


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

续前节OpenCV(C++版本)基础相关(2):图像的读取与显示、颜色空间转换、创建和赋值、像素的读写操作、像素的算术操作

六、滚动条操作

知识点:

  • createTrackbar(“Value Bar:”, “亮度调整”, &lightness, max_value,on_track);//调用函数。

6.1 quickopencv.h

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

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

6.2 QuickDemo.cpp

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

Mat src, dst, m;//定义变量
int lightness = 50;//初始化亮度50
static void on_track(int, void *) 
{
	m = Scalar(lightness, lightness, lightness);
	add(src, m, dst); //定义亮度变化为加
	//subtract(src, m, dst);//定义亮度变化为减
	imshow("亮度调整", dst);//显示调整亮度之后的图片
}

void QuickDemo::tracking_bar_demo(Mat &image)
{
	namedWindow("亮度调整", WINDOW_KEEPRATIO);
	resizeWindow("亮度调整", 320, 480);
	dst = Mat::zeros(image.size(),image.type());
	m = Mat::zeros(image.size(), image.type());
	src = image;
	int max_value = 100;//定义最大亮度为100
	createTrackbar("Value Bar", "亮度调整", &lightness, max_value, on_track);//调用函数。
	on_track(50, 0);
}

6.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.tracking_bar_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

在这里插入图片描述

七、滚动条-传递参数

知识点:

  • addWeighted(const CvArr* src1, double alpha,const CvArr* src2, double beta,double gamma, CvArr* dst)函数是将两张相同大小,相同类型的图片融合的函数。

    参数1:src1,第一张图.
    参数2:alpha,第一张图alpha
    参数3:src2 第二张图
    参数4:beta,第二张图alpha
    参数5:gamma,图1与图2作和后添加的数值
    参数6:dst,输出图片

    dst = src1[i] * alpha + src2 * beta + gamma;

7.1 quickopencv.h

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

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

7.2 QuickDemo.cpp

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

static void on_lightness(int b, void * userdata) 
{
	Mat image = *((Mat*)userdata);
	Mat dst = Mat::zeros(image.size(), image.type());
	Mat m = Mat::zeros(image.size(), image.type());
	m = Scalar(b, b, b);
	addWeighted(image, 1.0, m, 0, b, dst);//融合两张图
	imshow("亮度和对比度调整", dst);//显示调整之后的图片
}

static void on_contrast(int b, void * userdata)
{
	Mat image = *((Mat*)userdata);
	Mat dst = Mat::zeros(image.size(), image.type());
	Mat m = Mat::zeros(image.size(), image.type());
	double contrast = b / 100.0;
	m = Scalar(b, b, b);
	addWeighted(image, contrast, m, 0.0, 0, dst);//融合两张图
	imshow("亮度和对比度调整", dst);//显示调整之后的图片
}

void QuickDemo::tracking_bar_demo(Mat &image)
{
	namedWindow("亮度和对比度调整", WINDOW_KEEPRATIO);
	resizeWindow("亮度和对比度调整", 320, 480);
	int lightness = 50;
	int max_value = 100;//定义最大亮度为100
	int contrast_value = 100;
	createTrackbar("Value Bar", "亮度和对比度调整", &lightness, max_value, on_lightness, (void*)(&image));
	createTrackbar("Constrast Bar", "亮度和对比度调整", &contrast_value, 200, on_contrast, (void*)(&image));

	on_lightness(50, &image);
}

7.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.tracking_bar_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

在这里插入图片描述

八、键盘响应操作

知识点:

  • char c = waitKey(100);//等待100ms
  • if (c == 27)
    {
    break; //退出
    }//利用不同的按键输入,得到不一样的结果。

8.1 quickopencv.h

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

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

8.2 QuickDemo.cpp

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


void QuickDemo::key_demo(Mat &image)
{
	Mat dst = Mat::zeros(image.size(), image.type());
	while (true)
	{
		char c = waitKey(100);//等待100ms
		if (c == 27) { //退出
			break;
		}
		if (c == 49)//key#1
		{
			std::cout << "you print key #1" << std::endl;
			cvtColor(image, dst, COLOR_BGR2GRAY);
		}
		if (c == 50)//key#2
		{
			std::cout << "you print key #2" << std::endl;
			cvtColor(image, dst, COLOR_BGR2HSV);
		}
		if (c == 51)//key#3
		{
			std::cout << "you enter key #3" << std::endl;
			dst = Scalar(50, 50, 50);
			add(image, dst, dst);
		}
		namedWindow("键盘响应", WINDOW_KEEPRATIO);
		imshow("键盘响应", dst);
		resizeWindow("键盘响应", 320, 480);
		std::cout << c << std::endl;
	}
}

8.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.key_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

在这里插入图片描述

九、自带颜色操作

知识点:

  • applyColorMap(image, dst, colormap[index % 19]);//循环展示19种图片。

9.1 quickopencv.h

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

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

9.2 QuickDemo.cpp

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


void QuickDemo::color_style_demo(Mat &image)
{
	int colormap[] = {
		COLORMAP_AUTUMN ,
		COLORMAP_BONE,
		COLORMAP_CIVIDIS,
		COLORMAP_DEEPGREEN,
		COLORMAP_HOT,
		COLORMAP_HSV,
		COLORMAP_INFERNO,
		COLORMAP_JET,
		COLORMAP_MAGMA,
		COLORMAP_OCEAN,
		COLORMAP_PINK,
		COLORMAP_PARULA,
		COLORMAP_RAINBOW,
		COLORMAP_SPRING,
		COLORMAP_TWILIGHT,
		COLORMAP_TURBO,
		COLORMAP_TWILIGHT,
		COLORMAP_VIRIDIS,
		COLORMAP_TWILIGHT_SHIFTED,
		COLORMAP_WINTER
	};

	Mat dst;
	int index = 0;
	while (true)
	{
		char c = waitKey(2000);//停顿2000ms,可以改变等待时间,来改变播放速度 
		if (c == 27) { //esc 退出
			break;
		}
		if (c == 49)//按下按键数字键1时,保存图片到指定位置
		{
			std::cout << "you enter key #1" << std::endl;
			imwrite("D:/opencv/pictures/gray.jpg", dst);
		}
		applyColorMap(image, dst, colormap[index % 19]);//“%19”取模后,就能循环展示19种图片
		index++;
		namedWindow("颜色风格", WINDOW_KEEPRATIO);
		imshow("颜色风格", dst);					//在窗口显示图像
		resizeWindow("颜色风格", 320, 480);
	}
}

9.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.color_style_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

在这里插入图片描述

十、图像像素的逻辑操作

知识点:

  • rectangle(m1, Rect(100, 100, 80, 80), Scalar(255, 255, 0), -1, LINE_8, 0);//矩形坐标(100,100),大小80 * 80;颜色(255, 255, 0);小于0表示填充,大于0表示绘制;lineType:LINE_8;

10.1 quickopencv.h

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

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

10.2 QuickDemo.cpp

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


void QuickDemo::bitwise_demo(Mat &image)
{
	Mat m1 = Mat::zeros(Size(256, 256), CV_8UC3);
	Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);//两个大小类型完全一致
	rectangle(m1, Rect(100, 100, 80, 80), Scalar(255, 255, 0), -1, LINE_8, 0);//矩形坐标(100,100),大小80 * 80;颜色(255, 255, 0);小于0表示填充,大于0表示绘制;lineType:LINE_8;
	rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);//矩形坐标(150,150),大小80 * 80;颜色(0, 255, 255);小于0表示填充,大于0表示绘制;lineType:LINE_8;
	imshow("m1", m1);
	imshow("m2", m2);
	Mat dst;
	//bitwise_and(m1, m2, dst);//位操作“与”
	//bitwise_or(m1, m2, dst);//位操作“或”
	//bitwise_xor(m1, m2, dst);//位操作“异或”
	bitwise_not(image, dst);//位操作“非”

	namedWindow("像素位操作", WINDOW_KEEPRATIO);
	imshow("像素位操作", dst);					//在窗口显示图像
	resizeWindow("像素位操作", 320, 480);
}

10.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.bitwise_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值