imgui开发笔记<4>、image-slider online

news2024/11/30 2:50:40

 在线滑条二值化。

//
// Created by sry on 2021/6/30.
//

#include"imgui.h"
#include "imgui_impl_glfw.h"
#include "imgui_impl_opengl3.h"
#include <stdio.h>
// Initialize with gl3wInit()
#include<GL/gl3w.h>
// Include glfw3.h after our OpenGL definitions
#include <GLFW/glfw3.h>
#include<iostream>

#include<opencv2/opencv.hpp>

GLuint textureID;
cv::VideoCapture vcap;
bool FlagWetCamera = false;
bool FlagOpenCamera = false;

void imageProcess(const cv::Mat& image)
{
    //设置长宽
    int width = image.cols;
    int height = image.rows;
    int channel = image.channels();

    //获取图像指针
    int pixellength = width * height * channel;
    GLubyte* pixels = new GLubyte[pixellength];
    memcpy(pixels, image.data, pixellength * sizeof(char));

    // 使用GL指令生成贴图,获取贴图ID
    glGenTextures(1, &textureID);
    glBindTexture(GL_TEXTURE_2D, textureID);
    //必须一个RGB  一个BGR(opencv的mat类的颜色通道是BGR) 否则会出现颜色偏差
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, pixels);
    //纹理放大缩小使用线性插值
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glBindTexture(GL_TEXTURE_2D, 0);
    free(pixels);

}

static void glfw_error_callback(int error, const char* description)
{

    fprintf(stderr, "Glfw Error %d: %s\n", error, description);
}

int main()
{
    glfwSetErrorCallback(glfw_error_callback);
    if (!glfwInit())
    {
        return 1;
    }
    const char* glsl_version = "#version 130"; //
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
    // 创建窗口
    GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL3 example", NULL, NULL);
    if (window == NULL)
    {
        return 1;
    }
    glfwMakeContextCurrent(window);
    glfwSwapInterval(1); //  开启垂直同步

    if (gl3wInit() != 0)
    {
        fprintf(stderr, "Failed to initialize OpenGL loader!\n");
        return -1;
    }
    // 启动 ImGui 上下文
    IMGUI_CHECKVERSION();
    ImGui::CreateContext();
    ImGuiIO& io = ImGui::GetIO();
    (void)io;

    io.WantSaveIniSettings = true;
    io.IniFilename = "sry.ini";

    // 主题
    ImGui::StyleColorsDark();
    // 启动 平台、渲染 后端
    ImGui_ImplGlfw_InitForOpenGL(window, true);
    ImGui_ImplOpenGL3_Init(glsl_version);
    ImVec4 clear_color = ImVec4(0.f, 0.75f, 0.f, 0.30f);

    // 基于OpenCV加载图片
    cv::Mat image = cv::imread("d:/lena.jpg", 0);
    /*cv::Mat imageBW = cv::Mat::zeros(image.size(), CV_8UC1);
    cv::threshold(image, imageBW, 255, 255, cv::THRESH_BINARY);
    cv::imshow("bw", imageBW);
    cv::waitKey(0);*/
    cv::Mat imageBW = cv::Mat::zeros(image.size(), CV_8UC1);
    static float t = 100.f;
    cv::threshold(image, imageBW, t, 255, cv::THRESH_BINARY);
    cv::Mat imageBW_ = cv::Mat::zeros(image.size(), CV_8UC3);
    cv::cvtColor(imageBW, imageBW_, cv::COLOR_GRAY2BGRA);
    while (!glfwWindowShouldClose(window))
    {
        // 处理所有待办时间
        glfwPollEvents();
        // 启动imgui frame,刷新帧
        ImGui_ImplOpenGL3_NewFrame();
        ImGui_ImplGlfw_NewFrame();
        ImGui::NewFrame();

        // 显示图像
        {
            // //设置窗口的padding为0是图片控件充满窗口
            ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0));
            //设置窗口的边框大小为0
            ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0);
            // 改变窗口的背景颜色
            ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 100, 0.3));

            ImGui::Begin("camera", NULL, ImGuiWindowFlags_NoBringToFrontOnFocus);

            if (ImGui::SliderFloat("slider float", &t, 0.0f, 255.0f, "ratio = %.3f"))
            {
                cv::threshold(image, imageBW, t, 255, cv::THRESH_BINARY);
                cv::cvtColor(imageBW, imageBW_, cv::COLOR_GRAY2BGRA);
            }


            imageProcess(imageBW_);

            ImTextureID image_id = (GLuint*)textureID;
            ImGui::Image(image_id, ImGui::GetContentRegionAvail());
            //ImGui::Image(image_id, ImGui::GetContentRegionAvail(), ImVec2(0.0, 0.0), ImVec2(1.0, 1.0), ImVec4(0, 0, 255, 1), ImVec4(0, 255, 0, 1));

            ImGui::End();

            ImGui::PopStyleVar(2);
            ImGui::PopStyleColor(1);

        }


        // 渲染子窗口
        ImGui::Render();
        // 主窗口背景颜色
        gl3wClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w);
        glClear(GL_COLOR_BUFFER_BIT);

        ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
        glfwSwapBuffers(window);
    }

    // Release

    ImGui_ImplOpenGL3_Shutdown();
    ImGui_ImplGlfw_Shutdown();
    ImGui::DestroyContext();

    glfwDestroyWindow(window);
    glfwTerminate();
    return 1;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MATLAB第78期】基于MATLAB的VMD-SSA-LSTM麻雀算法优化LSTM时间序列预测模型

【MATLAB第78期】基于MATLAB的VMD-SSA-LSTM麻雀算法优化LSTM时间序列预测模型 一、LSTM data xlsread(数据集.xlsx);% [x,y]data_process(data,15);%前15个时刻 预测下一个时刻 %归一化 [xs,mappingx]mapminmax(x,0,1);xxs; [ys,mappingy]mapminmax(y,0,1);yys; %划分数据 n…

Android进阶——Handler底层fd监听之epoll机制

文章大纲 引言一、从网卡接收数据说起二、如何知道接收了数据&#xff1f;三、进程阻塞为什么不占用cpu资源&#xff1f;四、那么阻塞的原理是什么&#xff1f;1、工作队列2、等待队列3、唤醒进程 五、内核接收网络数据全过程六、同时监视多个socket的简单方法七、epoll的设计思…

Redis入门到精通——00数据类型

1、String 1.1、介绍 String 是最基本的 key-value 结构&#xff0c;key 是唯一标识&#xff0c;value 是具体的值&#xff0c;value其实不仅是字符串&#xff0c; 也可以是数字&#xff08;整数或浮点数&#xff09;&#xff0c;value 最多可以容纳的数据长度是 512M 1.2、…

聊天、会议、多媒体一体化:多平台支持的即时通讯系统 | 开源日报 No.44

harness/gitness Stars: 28.2k License: Apache-2.0 Gitness 是一个建立在 Drone 之上的新型开源开发者平台&#xff0c;具备代码托管和流水线功能。它提供了以下核心优势&#xff1a; 轻量级、超快速的代码托管和持续集成服务支持 Docker 容器化部署可以在本地环境中构建和…

【C/C++笔试练习】二维数组、二维数组的访问,解引用,地址计算、计算糖果、进制转换

文章目录 C/C笔试练习1.二维数组&#xff08;1&#xff09;二维数组的访问&#xff08;2&#xff09;二维数组的初始化&#xff08;3&#xff09;二维数组的解引用&#xff08;4&#xff09;二维数组的解引用&#xff08;5&#xff09;多维数组的解引用&#xff08;6&#xff0…

没有社会性的人机环境系统智能是危险的

缺乏社会性的人工智能常常存在着一定的潜在危险性&#xff0c;这是因为&#xff1a; 首先&#xff0c;社会性对于人类而言是非常重要的&#xff0c;我们通过社交互动、合作和沟通来建立联系、理解他人以及共同解决问题。人类具有复杂的情感和道德价值观&#xff0c;这些因素在我…

嵌入式学习笔记(39)蜂鸣器和PWM定时器编程实践

7.4.1蜂鸣器的工作原理 (1)蜂鸣器里边有2个金属片&#xff0c;离得很近但没挨着。没电的时候两个金属片在弹簧本身的张力作用下分开彼此平行&#xff0c;有电的时候两边分别充电&#xff0c;在异性电荷的吸力作用下两个片挨着。 (2)我们只要以快速的频率给蜂鸣器的正负极供电…

redis使用学习笔记

文章目录 关于redis的简单性能概括Redis命令行客户端Redis命令Redis通用命令String类型key的层级格式Hash类型List类型Set类型SortedSet类型 Redis的Java客户端Jedis使用基本步骤Jedis连接池 SpringDataRedisRedisTemplate快速入门RedisSerializer 关于redis的简单性能概括 键…

c语言练习72:关于截断和整形提升

关于截断和整形提升 思考: 什么时候会发生截断和整形提升? 当以int的形式定义一个变量然后以char的形式输出是就会发生截断和整形提升 例如: #include<stdio.h> int main() {char c1, c2, c3;int i, j;c1 a, c2 97, c3 243;i b, j 1 c1;printf("%c %d\n…

Airtool for Mac——高效便捷的系统菜单栏网络工具!

在我们的数字化生活中&#xff0c;对于网络连接的稳定性和速度有着越来越高的需求。为了满足您对网络质量的实时监测和分析的需求&#xff0c;我们向大家介绍一款强大的Mac系统菜单栏网络工具——Airtool&#xff01; Airtool是一款专为Mac设计的网络工具&#xff0c;它能够提…

每日一练-Q2-贝博士的机械零件-20231001

目录 1.题目描述 2.输入描述 3.示例提示 4.问题分析 5.通过代码 1.题目描述 贝博士是个大忙人&#xff0c;他在设计和制造一台非常复杂的机械式计算机。 最近贝博士有一点烦恼&#xff0c;因为机械零件的种类繁多&#xff0c;磨损又快&#xff0c;经费不太够用了。不过&…

【C++】string 之 substr、insert、erase函数的学习

前言 之前两篇文章 我们学习了 assign、at、append函数 find、rfind、replace、compare函数 这些函数。接下来让我们继续学习其他函数 substr 两个参数 pos1&#xff0c;截取的开始位置 len&#xff0c;截取的子串长度 作用是在字符串中截取一段长度为len的子串 下面给出…

最新整理源码面试题

经典框架源码面试题 Lecture&#xff1a;波哥 1.谈谈你对框架的理解 1.1 框架的作用 JavaWeb中的框架是一种开发工具或者平台&#xff0c;它提供了一系列的功能和组件&#xff0c;用于简化和加速Web应用的开发过程。框架可以提供一些基础设施&#xff0c;如数据库访问、用户认…

Linux系统之部署Linux命令大全搜索工具

Linux系统之部署Linux命令大全搜索工具 一、linux-command介绍二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍 三、安装httpd软件3.1 检查yum仓库3.2 安装httpd软件3.3 启动httpd服务3.4 查看httpd服务状态3.5 防火墙和selinux设置3.6 浏览器测试web服务 四、安装linux-com…

【AI视野·今日CV 计算机视觉论文速览 第255期】Wed, 27 Sep 2023

AI视野今日CS.CV 计算机视觉论文速览 Wed, 27 Sep 2023 (showing first 100 of 103 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Generating Visual Scenes from Touch Authors Fengyu Yang, Jiacheng Zhang, Andre…

螺丝帽验证码

网址&#xff1a;https://captcha.luosimao.com/demo 啥价螺丝帽验证码&#xff1f;&#xff1f;&#xff1f;一开始我也不知道&#xff0c;看k哥发了个动态就学了一下。 个人总结&#xff1a;难点在图片还原。 要或者图片的坐标的话&#xff0c;最简单快速的方式&#xff1a…

Spring的注解开发-注解原理解析-xml方式/注解方式组件扫描

目录 Spring注解的解析原理 xml配置组件扫描 注解方式配置组件扫描 原理图 yysy&#xff0c;没有搞太明白&#xff0c;真的复杂&#xff0c;欢迎大佬留言解惑 Spring注解的解析原理 使用Component等注解配置完毕后&#xff0c;要配置组件扫描才能使注解生效 xml配置组件扫…

尚硅谷HTML习笔记

计算机的两位先驱&#xff1a; 1、图灵 人工智能之父 2、冯诺依曼 现代计算机之父 计算机的组成 一、软件&#xff1a;分为系统软件和应用软件 系统软件&#xff1a;windows、mac、linux、harmony 应用软件&#xff1a;下载的软件如微信 二、硬件&#xff1a; ①中央处理器&am…

自媒体时代软件行业的新奇怪商业模式

前几天看一个公众号&#xff0c;介绍如何下载高质量的DEM数据&#xff0c;里面最吸引人是&#xff1a;博主大骂淘宝卖数据的无良商家&#xff0c;说他们的数据不值得买&#xff0c;赚的是黑心钱&#xff01; 本着好奇&#xff1a;我仔细阅读了一下数据的下载方式&#xff0c;非…

Spark性能监测+集群配置

spark-dashboard 参考链接 架构图 Spark官网中提供了一系列的接口可以查看任务运行时的各种指标 运行 卸载docker https://blog.csdn.net/wangerrong/article/details/126750198 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest…