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

相关推荐
智驱力人工智能4 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
qq_160144874 小时前
亲测!2026年零基础学AI的入门干货,新手照做就能上手
人工智能
Howie Zphile4 小时前
全面预算管理难以落地的核心真相:“完美模型幻觉”的认知误区
人工智能·全面预算
人工不智能5774 小时前
拆解 BERT:Output 中的 Hidden States 到底藏了什么秘密?
人工智能·深度学习·bert
盟接之桥4 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
kfyty7254 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
h64648564h4 小时前
CANN 性能剖析与调优全指南:从 Profiling 到 Kernel 级优化
人工智能·深度学习
数据与后端架构提升之路4 小时前
论系统安全架构设计及其应用(基于AI大模型项目)
人工智能·安全·系统安全
忆~遂愿4 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
Liue612312314 小时前
YOLO11-C3k2-MBRConv3改进提升金属表面缺陷检测与分类性能_焊接裂纹气孔飞溅物焊接线识别
人工智能·分类·数据挖掘