【opencv】示例-npr_demo.cpp 非真实感渲染:边缘保留平滑、细节增强、铅笔素描/彩色铅笔绘图和风格化处理...

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

相关推荐
深耕AI8 小时前
PyTorch自定义模型结构详解:从基础到高级实践
人工智能·pytorch·python
Twilight-pending8 小时前
计算机系统性能、架构设计、调度策略论文分类体系参考
人工智能·云原生·分类·数据挖掘
格林威8 小时前
工业检测机器视觉为啥非用工业相机?普通相机差在哪?
人工智能·数码相机·yolo·计算机视觉·视觉检测·相机
索迪迈科技8 小时前
深度解析:从DeepSeek V3.1到K2 Think的“专才”模型架构
人工智能·ai·语言模型
工藤学编程8 小时前
零基础学AI大模型之从0到1调用大模型API
人工智能
先做个垃圾出来………9 小时前
Dify开源AI框架介绍
人工智能·开源
带娃的IT创业者9 小时前
《AI大模型应知应会100篇》第68篇:移动应用中的大模型功能开发 —— 用 React Native 打造你的语音笔记摘要 App
人工智能·笔记·react native
Godspeed Zhao9 小时前
自动驾驶中的传感器技术42——Radar(3)
人工智能·机器学习·自动驾驶
Godspeed Zhao9 小时前
自动驾驶中的传感器技术41——Radar(2)
人工智能·机器学习·自动驾驶
非门由也10 小时前
《sklearn机器学习——数据预处理》类别特征编码
人工智能·机器学习·sklearn