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

3eb6297fb467050328586eebe33cebeb.png

2df397b04b4bc209992211cffae39096.gif

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

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

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

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

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

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

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

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

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

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

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

#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);// 创建随机数生成器对象 rRNG 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;
}

fcdc0b1e0365997e1b52d8bf9c2576b7.png

ea1d734e5394562103909fcbe69a023f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/304933.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT 线程之movetothread

上文列举了qt中线程的几种方法&#xff0c;其中2种方法最为常见。 这两种方法都少不了QThread类&#xff0c;前者继承于QThread类&#xff0c;后者复合QThread类。 本文以实例的方式描述了movetothread&#xff08;&#xff09;这种线程的方法&#xff0c;将QObject的子类移动…

【MATLAB源码-第13期】基于matlab的4ASK的误码率BER和误符号率SER理论和实际对比仿真。

1、算法描述 "4ASK" 是一种数字调制技术&#xff0c;代表4级振幅移移键控&#xff08;4-Level Amplitude Shift Keying&#xff09;调制。它是一种数字通信中常用的调制方式之一&#xff0c;用于将数字信号转换为模拟信号以便传输&#xff0c;或者将模拟信号转换为数…

【ROS2笔记三】构建ROS2功能包

3.构建ROS2功能包 文章目录 3.构建ROS2功能包3.1ROS2中包的组成部分3.2创建ROS2功能包并编写节点3.2.1使用CMake创建功能包3.2.2编写cpp节点代码 3.3编译运行节点3.4使用面向对象的方式编写ROS2节点3.5使用RCLPY编写节点Reference 3.1ROS2中包的组成部分 ROS2可以使用CMake或者…

Linux从入门到精通 --- 3.用户、权限

文章目录 第三章&#xff1a;3.1 root用户3.1.1 su3.1.2 exit3.1.3 sudo 3.2 用户和用户组3.2.1 用户组管理创建用户组删除用户组 3.2.2 用户管理创建用户删除用户查看用户所属组修改用户所属组 3.2.3 getent一&#xff1a;二&#xff1a; 3.3 查看权限控制信息3.3.1 认知权限信…

计算机网络——WEB服务器编程实验

实验目的 1. 处理一个 http 请求 2. 接收并解析 http 请求 3. 从服务器文件系统中获得被请求的文件 4. 创建一个包括被请求的文件的 http 响应信息 5. 直接发送该信息到客户端 具体内容 一、C 程序来实现 web 服务器功能。 二、用 HTML 语言编写两个 HTML文件&#xff0c;并…

Access2019实现按关键字搜索查找所需要的数据的功能

问题&#xff1a;随着数据库中数据条目的不断增加&#xff0c;如何直观简单的根据某些字段中的关键词&#xff0c;查找到对应的数据条目就成为了必须&#xff0c;这里通过创建具有查询输入框的窗体&#xff0c;实现Access数据库内的搜索功能&#xff01;&#xff01; 零、实施…

【C语言】函数递归编程题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 总结 题目一&#xff1a; 题目&#xff1a;接受一个整型值&#xff08;无符号&#xff09;&#xff0c;按照顺序打印它的每一位。&#xff08;递归完成&#xff09; 列如&#xff1a; …

Harmony鸿蒙南向驱动开发-GPIO接口使用

功能简介 GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出。通常&#xff0c;GPIO控制器通过分组的方式管理所有GPIO管脚&#xff0c;每组GPIO有一个或多个寄存器与之关联&#xff0c;通过读写寄存器完成对GPIO管脚的操作。 GPIO接口定义了操作GP…

Day80:服务攻防-中间件安全HW2023-WPS分析WeblogicJettyJenkinsCVE

目录 中间件-Jetty-CVE&信息泄漏 CVE-2021-34429(信息泄露) CVE-2021-28169(信息泄露) 中间件-Jenkins-CVE&RCE执行 cve_2017_1000353 CVE-2018-1000861 cve_2019_1003000 中间件-Weblogic-CVE&反序列化&RCE 应用金山WPS-HW2023-RCE&复现&上线…

windows ffmpeg7 通过rtsp拉取h265裸流

点击下边那个链接会转到github 下载完成后&#xff0c;添加include、lib到工程。 添加头文件&#xff1a; extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavformat/avio.h" #inclu…

Acrobat Pro DC 2021---PDF编辑与管理,打造高效PDF工作流程 含Mac+win

Acrobat Pro DC 2021包括全面的PDF编辑、OCR识别、多种输出格式转换以及强大的文件安全性保护。用户可轻松编辑、合并、转换PDF文件&#xff0c;同时支持将扫描文档转换为可编辑的PDF。可将PDF转换为Word、Excel、PowerPoint等格式&#xff0c;提高工作效率。 Mac电脑&#xf…

使用Docker部署开源项目FreeGPT35来免费调用ChatGPT3.5 API

Vercel部署FreeGPT35有严重限制&#xff0c;玩玩就好&#xff0c;真用还是得docker。 限制原因: Vercel的流式响应并不是一开始写流&#xff0c;客户端就能立刻收到响应流&#xff0c;而是先写到一个缓冲区&#xff0c;当流关闭才一股脑的流式响应回来(不是实时流) 因此导致: …

wireshark数据流分析学习日记day3-从 Pcap 导出对象

从 HTTP 流量导出文件 过滤http请求 发现get请求上传了两个文件 保存即可 也可以保存网页 点击保存 改文件名为html结尾以便于访问 请谨慎使用此方法。如果从 pcap 中提取恶意 HTML 代码并在 Web 浏览器中查看它&#xff0c;则 HTML 可能会调用恶意域&#xff0c;这就是为什么…

android-自定义TextView在文字内容末尾添加图片icon、可以添加间距

样式示意图 自定义属性 style.xml <declare-styleable name"IconLabelTextView"><attr name"iconSrc" format"reference"/><attr name"iconPaddingStart" format"dimension"/><attr name"iconPad…

【YOLOv8】Yolov5和Yolov8网络结构的分析与对比

目录 一 YOLOv5 二 YOLOv8 yolo通常采用backbone-neck-head的网络结构。 Backbone 主要负责从输入图像中提取高层次的语义特征,常包含多个卷积层和池化层&#xff0c;构建了一个深层次的特征提取器。Neck通常用来进一步整合与调整backbone提取的特征&#xff0c;有利于将不同…

odoo10 创建第一个应用

当odoo10环境创建好之后&#xff0c;需要设置一个用户 我这里设置的叫做odoo_user&#xff0c;并给他设置全部的权限&#xff0c;用于创建数据库。 当我们在odoo的web主页创建一个数据库&#xff0c;我这里叫做my_odoo&#xff0c;然后我们创建一个名为myapp的模块 python .…

Linux云计算之Linux基础3——Linux系统基础part-2

1、终端、shell、文件理论 1、终端 终端(terminal)&#xff1a;人和系统交互的必要设备&#xff0c;人机交互最后一个界面&#xff08;包含独立的输入输出设备&#xff09; 物理终端(console)&#xff1a;直接接入本机器的键盘设备和显示器虚拟终端(tty)&#xff1a;通过软件…

知了汇智鸿蒙系列讲座进校园,赋能产业数字化升级,助力创新人才培养

随着信创国产化战略的深入推进&#xff0c;以及万物互联时代的加速到来&#xff0c;信息技术产业正迎来前所未有的发展机遇。在这一背景下&#xff0c;成都知了汇智科技有限公司作为产教融合领域的先行者&#xff0c;积极响应国家号召&#xff0c;通过举办鸿蒙系列讲座进校园活…

对OceanBase中的配置项与系统变量,合法性检查实践

在“OceanBase 配置项&系统变量实现及应用详解”的系列文章中&#xff0c;我们已经对配置项和系统变量的源码进行了解析。当涉及到新增配置项或系统变量时&#xff0c;通常会为其指定一个明确的取值范围或定义一个专门的合法性检查函数。本文将详细阐述在不同情境下&#x…

【TB作品】MSP430单片机读取大气压强传感器BMP180

文章目录 实物main所有代码 实物 main #include <msp430.h> #include "stdio.h" #include "OLED.h"#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>// P2.2 oled scl // P2.3 oled sda// p…