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

相关推荐
Setsuna_F_Seiei4 小时前
前端的 AI 学习之路 02 之 Provider 与 Structured Output - 规范化模型输入输出
人工智能·agent·ai编程
JavaPub-rodert4 小时前
王仕宇RAG 实战教程(二):从 0 搭建一个可运行的 RAG 知识库——Embedding、Qdrant 与问答实战
人工智能·embedding
Setsuna_F_Seiei5 小时前
前端的 AI 学习之路 01 之 Agent API 调用 - 和 Agent 的基础对话
前端·人工智能·ai编程
咔咔学姐kk5 小时前
小白程序员必收藏:轻松入门AI Agent开发,大厂校招新风口!
人工智能·深度学习·ai·程序员·大模型·就业·大模型学习
2601_967097226 小时前
园区巡检机器人推荐:4项评估维度与主流产品横评
大数据·人工智能·信息可视化
stuartevil6 小时前
零基础怎么用AI文生漫剧做出一条完整视频
人工智能·音视频
极客猴子6 小时前
能提取抖音视频文案的APP推荐:短视频文案工具合集
人工智能·智能手机·音视频·语音识别
sel_96 小时前
【强化学习】Hands-on Modern RL项目实践|OPD 算法完整解析
人工智能·深度学习·算法·机器学习·语言模型
xushichang123_6 小时前
Agentic AI 应用 Token 开销居高不下,可借助哪些云平台与架构实现成本管控?
人工智能
世岩清上7 小时前
新能源宣传片怎么拍?如何用画面讲好你的绿色能源故事
大数据·人工智能·能源·宣传片·宣传片拍摄