文章目录
知识来源:哔哩哔哩。以下内容仅为学习笔记,不做其他用途。
二十六、直方图均衡化
知识点:
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;
}