【opencv】示例-falsecolor.cpp 使用OpenCV函数动态地对图像应用不同的色彩映射

该代码是一个使用OpenCV库实现的C++程序,主要用来展示如何通过applyColorMap函数将色彩映射应用到一个灰度图像上,并提供一个滑动条来实时改变色彩映射的效果。此外,该程序还可以绘制包含不同形状的灰度图像,用作applyColorMap函数的输入。程序的总体流程为:

  1. 引入OpenCV库和标准I/O库。

  2. 声明使用命名空间cv和std。

  3. 定义形状类型枚举MyShape。

  4. 定义ParamColorMap结构体保存色彩映射参数。

  5. 定义一个色彩映射窗口名称和色彩映射名称数组。

  6. 实现TrackColorMap回调函数,用于响应色彩映射滑动条操作。

  7. 实现DrawMyImage函数,绘制灰度图像并在图像上绘制随机形状。

  8. main函数中读取或生成输入图像,创建窗口环境,并展示图像和色彩映射效果。

  9. 等待用户按键退出程序。

整个程序示范了如何使用OpenCV函数动态地对图像应用不同的色彩映射,并且通过用户界面交互,让用户可以选择和查看不同的色彩映射效果。

cpp 复制代码
#include "opencv2/imgproc.hpp" // 包含OpenCV图像处理库
#include "opencv2/imgcodecs.hpp" // 包含OpenCV图像编解码库
#include "opencv2/highgui.hpp" // 包含OpenCV高级用户界面库
#include <iostream> // 包含标准输入输出流库


// 使用命名空间 cv 和 std 来简化代码中的类型和成员函数的引用
using namespace cv;
using namespace std;


// 定义一个枚举类型 MyShape 表示形状类型
enum MyShape{MyCIRCLE=0,MyRECTANGLE,MyELLIPSE};


// 定义一个结构体 ParamColorMap 存储色彩映射的参数
struct ParamColorMap {
    int iColormap; // 当前色彩映射的编号
    Mat img; // 存储将要映射色彩的图像
};


// 定义一个窗口名称常量
String winName="False color";
// 定义一个色彩映射名称数组,包括各种色彩映射的名称
static const String ColorMaps[] = {
    "Autumn", "Bone", "Jet", "Winter", "Rainbow", "Ocean", "Summer", "Spring",
    "Cool", "HSV", "Pink", "Hot", "Parula", "Magma", "Inferno", "Plasma", "Viridis",
    "Cividis", "Twilight", "Twilight Shifted", "Turbo", "Deep Green", "User defined (random)"
};


// 定义TrackColorMap回调函数,当拖动条改变时调用此函数实现色彩映射的更新
static void TrackColorMap(int x, void *r)
{
    ParamColorMap *p = (ParamColorMap*)r; // 将传入的void指针转换为ParamColorMap结构体指针
    Mat dst; // 创建一个输出图像
    p->iColormap = x; // 设置当前色彩映射的编号
    
    // 判断是否为用户自定义色彩映射
    if (x == COLORMAP_DEEPGREEN + 1)
    {
        // 创建一个随机的查找表 LUT (Look Up Table)
        Mat lutRND(256, 1, CV_8UC3);
        // 使用随机值填充查找表
        randu(lutRND, Scalar(0, 0, 0), Scalar(255, 255, 255));
        // 应用用户自定义的随机色彩映射
        applyColorMap(p->img, dst, lutRND);
    }
    else
    {
        // 应用官方定义的色彩映射
        applyColorMap(p->img, dst, p->iColormap);
    }


    // 在输出图像上添加文字,显示当前的色彩映射名称
    putText(dst, "Colormap : "+ColorMaps[p->iColormap], Point(10, 20), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(255, 255, 255), 2);
    // 在窗口中展示色彩映射后的图像
    imshow(winName, dst);
}


// 定义DrawMyImage函数,用于生成包含不同形状的灰度图像
static Mat DrawMyImage(int thickness, int nbShape)
{
    // 创建一个黑色背景的图像
    Mat img = Mat::zeros(500, 256*thickness + 100, CV_8UC1);
    // 定义线和形状的偏移量
    int offsetx = 50, offsety = 25;
    // 定义线的长度
    int lineLength = 50;


    // 绘制256个灰度梯度的线条
    for (int i=0; i<256; i++)
        line(img, Point(thickness * i + offsetx, offsety), Point(thickness * i + offsetx, offsety + lineLength), Scalar(i), thickness);
        
    // 创建随机数生成器对象 r
    RNG r;
    // 存储形状参数的变量
    Point center;
    int radius;
    int width, height;
    int angle;
    Rect rc;


    // 根据参数 nbShape 绘制随机数量和类型的形状
    for (int i=1; i<=nbShape; i++)
    {
        // 随机选择一个形状类型
        int typeShape = r.uniform(MyCIRCLE, MyELLIPSE + 1);
        switch (typeShape) {
        case MyCIRCLE:
            // 绘制一个圆形
            center = Point(r.uniform(offsetx, img.cols - offsetx), r.uniform(offsety + lineLength, img.rows - offsety));
            radius = r.uniform(1, min(offsetx, offsety));
            circle(img, center, radius, Scalar(i), -1);
            break;
        case MyRECTANGLE:
            // 绘制一个矩形
            center = Point(r.uniform(offsetx, img.cols - offsetx), r.uniform(offsety + lineLength, img.rows - offsety));
            width = r.uniform(1, min(offsetx, offsety));
            height = r.uniform(1, min(offsetx, offsety));
            rc = Rect(center - Point(width, height) / 2, center + Point(width, height) / 2);
            rectangle(img, rc, Scalar(i), -1);
            break;
        case MyELLIPSE:
            // 绘制一个椭圆
            center = Point(r.uniform(offsetx, img.cols - offsetx), r.uniform(offsety + lineLength, img.rows - offsety));
            width = r.uniform(1, min(offsetx, offsety));
            height = r.uniform(1, min(offsetx, offsety));
            angle = r.uniform(0, 180);
            ellipse(img, center, Size(width / 2, height / 2), angle, 0, 360, Scalar(i), -1);
            break;
        }
    }
    // 返回生成的图像
    return img;
}


// 程序的主入口
int main(int argc, char** argv)
{
    // 输出程序的简短描述
    cout << "This program demonstrates the use of applyColorMap function.\n\n";


    // 创建一个ParamColorMap结构体变量 p 来存储色彩映射的参数
    ParamColorMap  p;
    Mat img;


    // 判断命令行是否提供了输入文件路径
    if (argc > 1)
        // 如果提供了,则读取指定的图像文件
        img = imread(samples::findFile(argv[1]), IMREAD_GRAYSCALE);
    else
        // 如果没有提供,则生成一个图像
        img = DrawMyImage(2, 256);


    // 设置色彩映射的参数
    p.img = img;
    p.iColormap = 0;


    // 展示灰度图像
    imshow("Gray image", img);
    // 创建一个新窗口
    namedWindow(winName);
    // 在新窗口中创建一个滑动条,用于调节色彩映射
    createTrackbar("colormap", winName, NULL, COLORMAP_DEEPGREEN + 1, TrackColorMap, (void*)&p);
    // 设置滑动条的最小值
    setTrackbarMin("colormap", winName, COLORMAP_AUTUMN);
    // 设置滑动条的最大值
    setTrackbarMax("colormap", winName, COLORMAP_DEEPGREEN + 1);
    // 设置滑动条的当前位置
    setTrackbarPos("colormap", winName, COLORMAP_AUTUMN);


    // 初始调用TrackColorMap函数来展示色彩映射效果
    TrackColorMap(0, (void*)&p);


    // 打印提示信息,告知用户可以按任意键退出程序
    cout << "Press a key to exit" << endl;
    // 等待用户按键,然后关闭程序
    waitKey(0);
    return 0;
}
相关推荐
这个男人是小帅22 分钟前
【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本
人工智能·pytorch·python·深度学习·分类
__基本操作__24 分钟前
边缘提取函数 [OPENCV--2]
人工智能·opencv·计算机视觉
这是一个图像27 分钟前
从opencv-python入门opencv--图像处理之图像滤波
图像处理·opencv·计算机视觉·中值滤波·高斯滤波·双边滤波·图像滤波
Doctor老王29 分钟前
TR3:Pytorch复现Transformer
人工智能·pytorch·transformer
热爱生活的五柒29 分钟前
pytorch中数据和模型都要部署在cuda上面
人工智能·pytorch·深度学习
HyperAI超神经2 小时前
【TVM 教程】使用 Tensorize 来利用硬件内联函数
人工智能·深度学习·自然语言处理·tvm·计算机技术·编程开发·编译框架
扫地的小何尚4 小时前
NVIDIA RTX 系统上使用 llama.cpp 加速 LLM
人工智能·aigc·llama·gpu·nvidia·cuda·英伟达
埃菲尔铁塔_CV算法7 小时前
深度学习神经网络创新点方向
人工智能·深度学习·神经网络
艾思科蓝-何老师【H8053】7 小时前
【ACM出版】第四届信号处理与通信技术国际学术会议(SPCT 2024)
人工智能·信号处理·论文发表·香港中文大学
weixin_452600697 小时前
《青牛科技 GC6125:驱动芯片中的璀璨之星,点亮 IPcamera 和云台控制(替代 BU24025/ROHM)》
人工智能·科技·单片机·嵌入式硬件·新能源充电桩·智能充电枪