OpenCV(C++版本)基础相关(7):直方图均衡化、图像卷积操作、高斯模糊、高斯双边模糊、实时人脸检测案例


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

二十六、直方图均衡化

知识点:

  • equalizeHist(gray, dst);//直方图均衡化。参数包括:输入图像,输出图像。

26.1 quickopencv.h

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

class QuickDemo //QuickDemo对象
{
public:
	void histogram_eq_demo(Mat &image);
	
	
};

26.2 QuickDemo.cpp

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

void QuickDemo::histogram_eq_demo(Mat &image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);//BGR转灰度图像
	imshow("灰度图像", gray);

	//直方图均衡化只支持灰度图像,不支持彩色图像。
	Mat dst;
	equalizeHist(gray, dst);
	imshow("直方图均衡化演示", dst);
}

	

26.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/3 (4).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
	
	if (src.empty())
	{
		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
		return -1;
	}
	
	namedWindow("输入窗口", WINDOW_AUTOSIZE);	
	imshow("输入窗口", src);					//在窗口显示图像
	QuickDemo qd;								//调用之前创建的类对象	
	qd.histogram_eq_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

在这里插入图片描述

二十七、图像卷积操作

知识点:

  • blur(image, dst, Size(5, 5), Point(-1, -1));//卷积操作。//参数包括:image为输入图像;dst为输出图像;Size(5, 5)为卷积核大小5*5;Point(-1, -1)为默认的中心锚点。

27.1 quickopencv.h

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

class QuickDemo //QuickDemo对象
{
public:
	void blur_demo(Mat &image);
};

27.2 QuickDemo.cpp

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

void QuickDemo::blur_demo(Mat &image)
{
	Mat dst;
	blur(image, dst, Size(5, 5), Point(-1, -1));
	imshow("图像卷积操作", dst);
}

	

27.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/3 (1).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
	
	if (src.empty())
	{
		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
		return -1;
	}
	
	namedWindow("输入窗口", WINDOW_AUTOSIZE);	
	imshow("输入窗口", src);					//在窗口显示图像
	QuickDemo qd;								//调用之前创建的类对象	
	qd.blur_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

在这里插入图片描述

二十八、高斯模糊

知识点:

  • GaussianBlur(image, dst, Size(5, 5), 15);//高斯模糊。参数包括:image为输入图像;dst为输出图像;Size(5, 5)为内核大小5*5,必须是正数和奇数;第四个参数:double类型的sigmaX,表示高斯核函数在X方向上的标准偏差;第五个参数:double类型的sigmaY,表示高斯核函数在Y方向上的标准偏差。

28.1 quickopencv.h

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

class QuickDemo //QuickDemo对象
{
public:
	void gaussian_blur_demo(Mat &image);
};

28.2 QuickDemo.cpp

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

void QuickDemo::gaussian_blur_demo(Mat &image)
{
	Mat dst;
	GaussianBlur(image, dst, Size(5, 5), 15);
	imshow("高斯模糊", dst);
}

28.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/3 (1).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
	
	if (src.empty())
	{
		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
		return -1;
	}
	
	namedWindow("输入窗口", WINDOW_AUTOSIZE);	
	imshow("输入窗口", src);					//在窗口显示图像
	QuickDemo qd;								//调用之前创建的类对象	
	qd.gaussian_blur_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

在这里插入图片描述

二十九、高斯双边模糊

知识点:

  • bilateralFilter(image, dst, 0, 100, 0);//高斯双边模糊。参数包括:参数包括:image为输入图像;dst为输出图像;表示在滤波过程中每个像素邻域的直径。如果这个值设为非正数,则从第五个参数sigmaSpace来计算它;第四个参数:颜色空间滤波器的sigma值,这个值越大,表示该像素邻域内有越宽广的颜色被混合到一起,会产生较大的半相等颜色区域;第五个参数:坐标空间中滤波器的sigma值,坐标空间的标准方差,它的值越大,则越远的像素会相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。

29.1 quickopencv.h

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

class QuickDemo //QuickDemo对象
{
public:
	void bifilter_demo(Mat &image);
};

29.2 QuickDemo.cpp

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

void QuickDemo::bifilter_demo(Mat &image)
{
	Mat dst;
	bilateralFilter(image, dst, 0, 100, 0);
	namedWindow("高斯双边模糊", WINDOW_FREERATIO);
	imshow("高斯双边模糊", dst);
}

29.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/3 (1).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
	
	if (src.empty())
	{
		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
		return -1;
	}
	
	namedWindow("输入窗口", WINDOW_AUTOSIZE);	
	imshow("输入窗口", src);					//在窗口显示图像
	QuickDemo qd;								//调用之前创建的类对象	
	qd.bifilter_demo(src);
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

在这里插入图片描述

三十、案例:实时人脸检测

30.1 quickopencv.h

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

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

30.2 QuickDemo.cpp

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

void QuickDemo::face_detecction_demo()
{
	std::string root_dir = "D:/opencv/sources/samples/dnn/face_detector/";
	dnn::Net net = dnn::readNetFromTensorflow(root_dir+"opencv_face_detector_uint8.pb",root_dir+"opencv_face_detector.pbtxt");
	VideoCapture capture("D:/opencv/pictures/1234.mp4");
	Mat frame;
	while (true)
	{
		capture.read(frame);
		if (frame.empty())
		{
			break;
		}
		Mat blob = dnn::blobFromImage(frame,1.0,Size(300,300),Scalar(104,177,123),false,false);
		net.setInput(blob);
		Mat probs = net.forward();
		Mat detectionMat(probs.size[2],probs.size[3],CV_32F,probs.ptr<float>());
		for (int i = 0; i < detectionMat.rows; i++)
		{
			float confidence = detectionMat.at<float>(i, 2);
			if (confidence > 0.5)
			{
				int x1 = static_cast<int>(detectionMat.at<float>(i, 3)*frame.cols);
				int y1 = static_cast<int>(detectionMat.at<float>(i, 4)*frame.rows);
				int x2 = static_cast<int>(detectionMat.at<float>(i, 5)*frame.cols);
				int y2 = static_cast<int>(detectionMat.at<float>(i, 6)*frame.rows);
				Rect box(x1,y1,x2-x1,y2-y1);
				rectangle(frame,box,Scalar(0,0,255),2,8,0);
			}
		}
		imshow("人脸检测演示",frame);
		int c = waitKey(1);
		if (c == 27) {
			break;	
		}
	}
}



	

30.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/3 (1).jpeg", IMREAD_ANYCOLOR);//B,G,R蓝绿红通道图像
	
	if (src.empty())
	{
		printf("could not load image");			//如果路径不正确,则显示无法导入图片。
		return -1;
	}
	
	namedWindow("输入窗口", WINDOW_AUTOSIZE);	
	imshow("输入窗口", src);					//在窗口显示图像
	QuickDemo qd;								//调用之前创建的类对象	
	qd.face_detecction_demo();
	waitKey(0);									//暂停程序,等待一个按键输入,单位ms
	destroyAllWindows();						//销毁所有创建的窗口
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值