在线滑条二值化。
//
// 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;
}