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

相关推荐
星爷AG I15 分钟前
14-12 动作序列学习(AGI基础理论)
人工智能·学习·agi
无限大616 分钟前
数字生存01:AI越强大,越要守住这3种"做人的底气"
人工智能
无限大631 分钟前
职场逻辑01:别再瞎努力!AI时代,职场核心竞争力排序
人工智能
带娃的IT创业者38 分钟前
WeClaw 离线消息队列实战:异步任务队列如何保证在服务器宕机时不丢失任何一条 AI 回复?
运维·服务器·人工智能·python·websocket·fastapi·实时通信
最新快讯1 小时前
AI前沿技术日更简报 - 2026-03-17
人工智能
wal13145201 小时前
OpenClaw教程(九)—— 彻底告别!OpenClaw 卸载不残留指南
前端·网络·人工智能·chrome·安全·openclaw
老鱼说AI1 小时前
CUDA架构与高性能程序设计:异构数据并行计算
开发语言·c++·人工智能·算法·架构·cuda
牛奶1 小时前
分享一个开源项目,让 AI 辅助开发真正高效起来
前端·人工智能·全栈
GIS数据转换器2 小时前
延凡城市生命线系统
大数据·人工智能·信息可视化·数据挖掘·无人机
Baihai_IDP2 小时前
OpenClaw 架构详解 · 第一部分:控制平面、会话管理与事件循环
人工智能·面试·llm