Edge Preserve Smoothing- Using Normalized convolution Filter
Edge Preserve Smoothing-Using Recursive Filter
Detail Enhancement
Pencil sketch/Color Pencil Drawing
Stylization
/*
* 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的非真实感渲染样例程序,功能包括保边平滑处理、细节增强、铅笔素描/彩色铅笔绘图以及风格化。用户可以通过命令行选择使用哪种处理技术,并可以通过终端的交互提示进行进一步的选择。处理后的图像将会显示在窗口中。