cococry / leif

Minimal, configurable & GPU accelerated Immediate Mode UI Library written with modern OpenGL
794 stars 32 forks source link

Using OpenCV Mat as texture #11

Open lsdrfrx opened 3 months ago

lsdrfrx commented 3 months ago

Hi Coco! It's me again

Give me a hint: is there any option to use OpenCV Mat as LfTexture id? I need to show frames from VideoCapture, and, I guess, I shall do it with lf_image, but I can't find if it is possible

Thanks for help!

cococry commented 3 months ago

if you have the opengl texture id, you can just do lf_image((LfTexture){.id = your_opencv_opengl_tex_id, .width = your_width, .height = your_height});

On Wed 5. Jun 2024 at 15:52, Christian Guetnga @.***> wrote:

Hi Coco! It's me again

Give me a hint: is there any option to use OpenCV Mat as LfTexture id? I need to show frames from VideoCapture, and, I guess, I shall do it with lf_image, but I can't find if it is possible

Thanks for help!

— Reply to this email directly, view it on GitHub https://github.com/cococry/leif/issues/11, or unsubscribe https://github.com/notifications/unsubscribe-auth/AXNJRYSKFF5PMTTJXEF7LI3ZF4JYLAVCNFSM6AAAAABI2YX2PWVHI2DSMVQWIX3LMV43ASLTON2WKOZSGMZTKOJYGMYDMMY . You are receiving this because you are subscribed to this thread.Message ID: @.***>

lsdrfrx commented 3 months ago

Thanks. When I figure this out, I'll post the solution here, in case it's useful to someone

cococry commented 3 months ago

you can use lf_load_texture_from_memory and use mat.ptr(); as data. then render the image with lf_image.

lsdrfrx commented 3 months ago

I'm doing this:

  cv::Mat im = cv::imread("../data/inference/man.jpg");
  if (im.empty()) {
    std::cout << "Unable to open image" << std::endl;
    exit(-1);
  }

  // Then, inside rendering function
  LfTexture tex = lf_load_texture_from_memory(im.ptr(), sizeof(im), true, LF_TEX_FILTER_NEAREST);

  auto div_props = lf_get_theme().div_props;

  div_props.color = COLOR_BACKGROUND;
  div_props.text_color = COLOR_FOREGROUND;

  lf_push_style_props(div_props);

  lf_div_begin(((vec2s){SIDEBAR_WIDTH, APPBAR_HEIGHT}), ((vec2s){(float)(state.win->get_width() - SIDEBAR_WIDTH), container_height}), false);
  {
    lf_image((LfTexture){.id = tex.id, .width = tex.width, .height = tex.height});
  }
  lf_div_end();

  lf_pop_style_props();

But image is blank. When debugging in GDB, I output tex and see the following:

(gdb) print tex
$1 = {id = 1433094080, width = 21845, height = 208}
(gdb)

Width is crazy, height does not match to image height. What am I doing wrong?