Edge Preserve Smoothing- Using Normalized convolution Filter
Edge Preserve Smoothing-Using Recursive Filter
Detail Enhancement
Pencil sketch/Color Pencil Drawing
Stylization
cpp
/*
* npr_demo.cpp
*
* 作者:
* Siddharth Kherada <siddharthkherada27[at]gmail[dot]com>
*
* 这个教程展示了如何使用OpenCV非真实感渲染模块。
* 1) 保边平滑处理
* -> 使用归一化卷积滤波器
* -> 使用递归滤波器
* 2) 细节增强
* 3) 铅笔素描/彩色铅笔绘图
* 4) 风格化
*
*/
#include <signal.h> // 导入signal信号处理库
#include "opencv2/photo.hpp" // 导入OpenCV非真实感渲染模块头文件
#include "opencv2/imgproc.hpp" // 导入OpenCV图像处理模块头文件
#include "opencv2/imgcodecs.hpp" // 导入OpenCV图像编解码模块头文件
#include "opencv2/highgui.hpp" // 导入OpenCV用户界面模块头文件
#include "opencv2/core.hpp" // 导入OpenCV核心功能模块头文件
#include <iostream> // 导入输入输出流库
#include <stdlib.h> // 导入标准库,包含一些基本功能
using namespace std; // 使用std命名空间
using namespace cv; // 使用cv命名空间(OpenCV功能)
int main(int argc, char* argv[]) // 主函数入口,传入命令行参数
{
// 命令行解析器,可以处理传入的参数
cv::CommandLineParser parser(argc, argv, "{help h||show help message}{@image|lena.jpg|input image}");
if (parser.has("help")) // 如果输入了help参数
{
parser.printMessage(); // 打印帮助信息
return 0; // 终止程序
}
// 获取输入的图像文件名
string filename = samples::findFile(parser.get<string>("@image"));
// 读取图像文件
Mat I = imread(filename);
// 用于用户选择的变量
int num,type;
if(I.empty()) // 如果图像为空,则文件未找到
{
cout << "Image not found" << endl; // 输出图像未找到信息
return 1; // 终止程序
}
// 以下是用于展示的信息提示
cout << endl;
cout << " Edge Preserve Filter" << endl;
cout << "----------------------" << endl;
cout << "Options: " << endl;
cout << endl;
cout << "1) Edge Preserve Smoothing" << endl;
cout << " -> Using Normalized convolution Filter" << endl;
cout << " -> Using Recursive Filter" << endl;
cout << "2) Detail Enhancement" << endl;
cout << "3) Pencil sketch/Color Pencil Drawing" << endl;
cout << "4) Stylization" << endl;
cout << endl;
cout << "Press number 1-4 to choose from above techniques: ";
// 获取用户选择的处理技术编号
cin >> num;
// 创建一个Mat对象用于存放处理后的图像
Mat img;
// 根据用户选择的技术编号,调用不同的处理函数
if(num == 1)
{
cout << endl;
cout << "Press 1 for Normalized Convolution Filter and 2 for Recursive Filter: ";
// 获取用户选择的滤波器类型
cin >> type;
// 执行保边平滑处理
edgePreservingFilter(I,img,type);
// 显示处理后的图像
imshow("Edge Preserve Smoothing",img);
}
else if(num == 2)
{
// 执行细节增强处理
detailEnhance(I,img);
// 显示处理后的图像
imshow("Detail Enhanced",img);
}
else if(num == 3)
{
// 创建一个Mat对象用于存放彩色素描图像
Mat img1;
// 执行铅笔素描/彩色铅笔绘图处理
pencilSketch(I,img1, img, 10 , 0.1f, 0.03f);
// 显示处理后的铅笔素描图像
imshow("Pencil Sketch",img1);
// 显示处理后的彩色铅笔绘图图像
imshow("Color Pencil Sketch",img);
}
else if(num == 4)
{
// 执行风格化处理
stylization(I,img);
// 显示处理后的图像
imshow("Stylization",img);
}
// 等待用户按键以便可以看到图像
waitKey(0);
}
这段代码是一个OpenCV的非真实感渲染样例程序,功能包括保边平滑处理、细节增强、铅笔素描/彩色铅笔绘图以及风格化。用户可以通过命令行选择使用哪种处理技术,并可以通过终端的交互提示进行进一步的选择。处理后的图像将会显示在窗口中。