Beispiel #1
0
static void
on_cam_renderer_param_widget_changed (GtkuParamWidget *pw, const char *param,
        void *user_data)
{
    cam_renderer_t *cr = (cam_renderer_t*) user_data;

    // delete the old texture object if it exists.  make sure that we've
    // selected the correct OpenGL context
    if (cr->texture) {
        if (cr->render_place == RENDER_IN_WIDGET) {
            gtku_gl_drawing_area_set_context (cr->gl_area);
        } else {
            gtku_gl_drawing_area_set_context (cr->renderer->viewer->gl_area);
        }

        glutil_texture_free (cr->texture);
        cr->texture = NULL;
    }

    cr->render_place = gtku_param_widget_get_enum (pw, PARAM_RENDER_IN);
    if (cr->render_place == RENDER_IN_WIDGET) {
        gtk_widget_show (GTK_WIDGET (cr->gl_area));
    } else {
        gtk_widget_hide (GTK_WIDGET (cr->gl_area));
    }

    cr->is_uploaded = 0;
    viewer_request_redraw (cr->renderer->viewer);
}
Beispiel #2
0
void draw_images (botlcm_image_t **img, int nimg, double ratio, double *user_trans)
{
    for (int i=0;i<nimg;i++) {
        botlcm_image_t *im = img[i];
        if (!im) continue;
        gboolean greyscale = img[i]->pixelformat == CAM_PIXEL_FORMAT_GRAY;

        GLUtilTexture *tex = glutil_texture_new (im->width, im->height, im->row_stride * im->height);
        if (!tex) continue;
        glutil_texture_upload (tex, greyscale ? GL_LUMINANCE : GL_RGB, GL_UNSIGNED_BYTE, im->row_stride, im->data);
        int xmin = i * im->width * ratio + user_trans[0];
        int xmax = (i+1) * im->width * ratio + user_trans[0];
        int ymin = 0 + user_trans[1];
        int ymax = im->height*ratio + user_trans[1];
        glutil_texture_draw_pt (tex, xmin, ymin, xmin, ymax, xmax, ymax, xmax, ymin);
        glutil_texture_free (tex);
    }
}
Beispiel #3
0
/* draw image sub-region
 */
void draw_img_subregion (botlcm_image_t **img, int nimg, int col, int row, int sensorid, float scale, float orientation, int feature_type, int wcol, int wrow)
{
    if (sensorid < 0 || sensorid > 4) {
        printf ("mmm... sensorid = %d for feature at pos %d %d (orientation: %.3f)\n", sensorid, col, row, orientation);
    }

    
    /* SURF scale is different */
    if (feature_type == NAVLCM_FEATURES_PARAM_T_SURF64 || feature_type == NAVLCM_FEATURES_PARAM_T_SURF128)
        scale *= 8;

    /* SIFT scale is different */
    if (feature_type == NAVLCM_FEATURES_PARAM_T_SIFT || feature_type == NAVLCM_FEATURES_PARAM_T_SIFT2)
       scale *= 1.414 * 3 * (4 + 1) / 2.0;
    
    /* FAST scale is different */
    if (feature_type == NAVLCM_FEATURES_PARAM_T_FAST)
        scale = 15;

    assert (0 <= sensorid && sensorid <= 4);

    botlcm_image_t *image = img[sensorid];

    assert (image);

    int size = 100;
    unsigned char *data = (unsigned char*)calloc(3*size*size,sizeof(unsigned char));

    if (sensorid == 0)
        wcol += 500;


    // fill pixels
    for (int c=0;c<size;c++) {
        for (int r=0;r<size;r++) {
            int cp = col + (int)((1.0 * c - size/2)/(size/2) * scale);
            int rp = row + (int)((1.0 * r - size/2)/(size/2) * scale);
            if (0 <= cp && cp < image->width && 0 <= rp && rp < image->height) {
                data[3*(r*size+c)] = image->data[rp*image->width + cp];
                data[3*(r*size+c)+1] = image->data[rp*image->width + cp];
                data[3*(r*size+c)+2] = image->data[rp*image->width + cp];
            }
        }
    }


    // draw orientation as a line
    for (int r=0;r<size;r++) {
        int cp = size/2 + (int)(1.0 * r - size/2) * cos (orientation);
        int rp = size/2 + (int)(1.0 * r - size/2) * sin (orientation);
        if (0 <= cp && cp < size && 0 <= rp && rp < size) {
            data[3*(rp*size+cp)] = 255;
            data[3*(rp*size+cp)+1] = 255;
            data[3*(rp*size+cp)+2] = 0;
        }
    }


    // draw red cross at the center
    for (int r=0;r<20;r++) {
        data[3*(size/2*size+size/2+r-10)] = 255;
        data[3*(size/2*size+size/2+r-10)+1] = 0;
        data[3*(size/2*size+size/2+r-10)+2] = 0;
    }
    for (int r=0;r<20;r++) {
        data[3*((size/2+r-10)*size+size/2)] = 255;
        data[3*((size/2+r-10)*size+size/2)+1] = 0;
        data[3*((size/2+r-10)*size+size/2)+2] = 0;
    }

    GLUtilTexture *tex = glutil_texture_new (size, size, 3*size*size);
    if (tex) {
        int xmin = wcol;
        int xmax = xmin+size-1;
        int ymin = wrow;
        int ymax = ymin+size-1;

        // on a red background
        glColor3f (1,0,0);
        glBegin (GL_QUADS);
        glVertex2f (xmin-4, ymin-4);
        glVertex2f (xmin-4, ymax+4);
        glVertex2f (xmax+4, ymax+4);
        glVertex2f (xmax+4, ymin-4);
        glEnd ();

        glutil_texture_upload (tex, GL_RGB, GL_UNSIGNED_BYTE, 3*size, data);
        glutil_texture_draw_pt (tex, xmin, ymin, xmin, ymax, xmax, ymax, xmax, ymin);
        glutil_texture_free (tex);
    }

    free (data);
}