UI: get video aspect ratio from camera intrinsics (#2351)

* UI: get video aspect ratio from camera intrinsics

* cleanup video rect definition

* const zoom

* Match zoom level

* Fix comment

* Zoom out more
pull/2369/head
Willem Melching 5 years ago committed by GitHub
parent 5bcac27d98
commit 9d0b893944
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 38
      selfdrive/ui/paint.cc
  2. 2
      selfdrive/ui/ui.hpp

@ -16,18 +16,21 @@ extern "C"{
#include "paint.hpp" #include "paint.hpp"
#include "sidebar.hpp" #include "sidebar.hpp"
// TODO: this is also hardcoded in common/transformations/camera.py // TODO: this is also hardcoded in common/transformations/camera.py
// TODO: choose based on frame input size // TODO: choose based on frame input size
#ifdef QCOM2 #ifdef QCOM2
const float zoom = 1.5;
const mat3 intrinsic_matrix = (mat3){{ const mat3 intrinsic_matrix = (mat3){{
2648.0, 0.0, 1928.0/2, 2648.0, 0.0, 1928.0/2,
0.0, 2648.0, 1208.0/2, 0.0, 2648.0, 1208.0/2,
0.0, 0.0, 1.0 0.0, 0.0, 1.0
}}; }};
#else #else
const float zoom = 2.35;
const mat3 intrinsic_matrix = (mat3){{ const mat3 intrinsic_matrix = (mat3){{
910., 0., 582., 910., 0., 1164.0/2,
0., 910., 437., 0., 910., 874.0/2,
0., 0., 1. 0., 0., 1.
}}; }};
#endif #endif
@ -339,21 +342,19 @@ static void ui_draw_vision_lanes(UIState *s) {
// Draw all world space objects. // Draw all world space objects.
static void ui_draw_world(UIState *s) { static void ui_draw_world(UIState *s) {
const UIScene *scene = &s->scene; const UIScene *scene = &s->scene;
const Rect &viz_rect = scene->viz_rect;
const int viz_w = s->fb_w - bdr_s * 2;
const int inner_height = float(viz_w) * s->fb_h / s->fb_w;
nvgSave(s->vg); nvgSave(s->vg);
nvgScissor(s->vg, viz_rect.x, viz_rect.y, viz_rect.w, viz_rect.h); nvgScissor(s->vg, s->video_rect.x, s->video_rect.y, s->video_rect.w, s->video_rect.h);
nvgTranslate(s->vg, viz_rect.x+scene->ui_viz_ro, viz_rect.y + (viz_rect.h-inner_height)/2.0); // Apply transformation such that video pixel coordinates match video
nvgScale(s->vg, (float)viz_w / s->fb_w, (float)inner_height / s->fb_h); // 1) Put (0, 0) in the middle of the video
nvgTranslate(s->vg, s->video_rect.x + s->video_rect.w / 2, s->video_rect.y + s->video_rect.h / 2);
float w = 1440.0f; // Why 1440? // 2) Apply same scaling as video
nvgTranslate(s->vg, (s->fb_w - w) / 2.0f, 0.0); nvgScale(s->vg, zoom, zoom);
nvgTranslate(s->vg, -w / 2, -1080.0f / 2); // 3) Put (0, 0) in top left corner of video
nvgScale(s->vg, 2.0, 2.0); nvgTranslate(s->vg, -intrinsic_matrix.v[2], -intrinsic_matrix.v[5]);
nvgScale(s->vg, w / s->stream.bufs_info.width, 1080.0f / s->stream.bufs_info.height);
// Draw lane edges and vision/mpc tracks // Draw lane edges and vision/mpc tracks
ui_draw_vision_lanes(s); ui_draw_vision_lanes(s);
@ -576,7 +577,7 @@ static void ui_draw_vision(UIState *s) {
// Draw video frames // Draw video frames
glEnable(GL_SCISSOR_TEST); glEnable(GL_SCISSOR_TEST);
glViewport(viz_rect.x+scene->ui_viz_ro, viz_rect.y, s->fb_w - bdr_s*2, viz_rect.h); glViewport(s->video_rect.x, s->video_rect.y, s->video_rect.w, s->video_rect.h);
glScissor(viz_rect.x, viz_rect.y, viz_rect.w, viz_rect.h); glScissor(viz_rect.x, viz_rect.y, viz_rect.w, viz_rect.h);
draw_frame(s); draw_frame(s);
glDisable(GL_SCISSOR_TEST); glDisable(GL_SCISSOR_TEST);
@ -799,10 +800,13 @@ void ui_nvg_init(UIState *s) {
glBindVertexArray(0); glBindVertexArray(0);
} }
// frame from 4/3 to box size with a 2x zoom s->video_rect = Rect{bdr_s * 3, bdr_s, s->fb_w - 4 * bdr_s, s->fb_h - 2 * bdr_s};
float zx = zoom * 2 * intrinsic_matrix.v[2] / s->video_rect.w;
float zy = zoom * 2 * intrinsic_matrix.v[5] / s->video_rect.h;
const mat4 frame_transform = {{ const mat4 frame_transform = {{
(float)(2*(4./3.)/((float)(s->fb_w-(bdr_s*2))/(s->fb_h-(bdr_s*2)))), 0.0, 0.0, 0.0, zx, 0.0, 0.0, 0.0,
0.0, 2.0, 0.0, 0.0, 0.0, zy, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0,
}}; }};

@ -192,6 +192,8 @@ typedef struct UIState {
track_vertices_data track_vertices[2]; track_vertices_data track_vertices[2];
model_path_vertices_data model_path_vertices[MODEL_LANE_PATH_CNT * 2]; model_path_vertices_data model_path_vertices[MODEL_LANE_PATH_CNT * 2];
Rect video_rect;
} UIState; } UIState;
void ui_init(UIState *s); void ui_init(UIState *s);

Loading…
Cancel
Save