www.pudn.com > match-v3.3.src.rar > data.cpp
/* data.cpp */ /* Vladimir Kolmogorov (vnk@cs.cornell.edu), 2001-2003. */ /* Functions depending on input images: data_penalty_X(Coord l, Coord r) smoothness_penalty_left_X(Coord p, Coord np, Coord disp, Coord ndisp) smoothness_penalty_right_X(Coord p, Coord np, Coord disp, Coord ndisp) smoothness_penalty2_X(Coord p, Coord np, Coord disp) where X describes the appropriate case (GRAY/COLOR, SUBPIXEL/no SUBPIXEL) */ #include#include #include "match.h" #define MIN(a, b) ((a) < (b) ? (a) : (b)) /************************************************************/ /********************* data penalty *************************/ /************************************************************/ #define CUTOFF 1000 int Match::data_penalty_GRAY(Coord l, Coord r) { int d; d = IMREF(im_left, l) - IMREF(im_right, r); if (params.data_cost==Parameters::L1) { if (d<0) d = -d; } else d = d*d; if (d>CUTOFF) d = CUTOFF; return d; } int Match::data_penalty_COLOR(Coord l, Coord r) { int d, d_sum = 0; /* red component */ d = IMREF(im_color_left, l).r - IMREF(im_color_right, r).r; if (params.data_cost==Parameters::L1) { if (d<0) d = -d; } else d = d*d; if (d>CUTOFF) d = CUTOFF; d_sum += d; /* green component */ d = IMREF(im_color_left, l).g - IMREF(im_color_right, r).g; if (params.data_cost==Parameters::L1) { if (d<0) d = -d; } else d = d*d; if (d>CUTOFF) d = CUTOFF; d_sum += d; /* blue component */ d = IMREF(im_color_left, l).b - IMREF(im_color_right, r).b; if (params.data_cost==Parameters::L1) { if (d<0) d = -d; } else d = d*d; if (d>CUTOFF) d = CUTOFF; d_sum += d; return d_sum/3; } int Match::data_penalty_SUBPIXEL_GRAY(Coord l, Coord r) { int dl, dr, d; int Il, Il_min, Il_max, Ir, Ir_min, Ir_max; Il = IMREF(im_left, l); Ir = IMREF(im_right, r); Il_min = IMREF(im_left_min, l); Ir_min = IMREF(im_right_min, r); Il_max = IMREF(im_left_max, l); Ir_max = IMREF(im_right_max, r); if (Il < Ir_min) dl = Ir_min - Il; else if (Il > Ir_max) dl = Il - Ir_max; else return 0; if (Ir < Il_min) dr = Il_min - Ir; else if (Ir > Il_max) dr = Ir - Il_max; else return 0; d = MIN(dl, dr); if (params.data_cost==Parameters::L2) d = d*d; if (d>CUTOFF) d = CUTOFF; return d; } int Match::data_penalty_SUBPIXEL_COLOR(Coord l, Coord r) { int dl, dr, d, d_sum = 0; int Il, Il_min, Il_max, Ir, Ir_min, Ir_max; /* red component */ Il = IMREF(im_color_left, l).r; Ir = IMREF(im_color_right, r).r; Il_min = IMREF(im_color_left_min, l).r; Ir_min = IMREF(im_color_right_min, r).r; Il_max = IMREF(im_color_left_max, l).r; Ir_max = IMREF(im_color_right_max, r).r; if (Il < Ir_min) dl = Ir_min - Il; else if (Il > Ir_max) dl = Il - Ir_max; else dl = 0; if (Ir < Il_min) dr = Il_min - Ir; else if (Ir > Il_max) dr = Ir - Il_max; else dr = 0; d = MIN(dl, dr); if (params.data_cost==Parameters::L2) d = d*d; if (d>CUTOFF) d = CUTOFF; d_sum += d; /* green component */ Il = IMREF(im_color_left, l).g; Ir = IMREF(im_color_right, r).g; Il_min = IMREF(im_color_left_min, l).g; Ir_min = IMREF(im_color_right_min, r).g; Il_max = IMREF(im_color_left_max, l).g; Ir_max = IMREF(im_color_right_max, r).g; if (Il < Ir_min) dl = Ir_min - Il; else if (Il > Ir_max) dl = Il - Ir_max; else dl = 0; if (Ir < Il_min) dr = Il_min - Ir; else if (Ir > Il_max) dr = Ir - Il_max; else dr = 0; d = MIN(dl, dr); if (params.data_cost==Parameters::L2) d = d*d; if (d>CUTOFF) d = CUTOFF; d_sum += d; /* blue component */ Il = IMREF(im_color_left, l).b; Ir = IMREF(im_color_right, r).b; Il_min = IMREF(im_color_left_min, l).b; Ir_min = IMREF(im_color_right_min, r).b; Il_max = IMREF(im_color_left_max, l).b; Ir_max = IMREF(im_color_right_max, r).b; if (Il < Ir_min) dl = Ir_min - Il; else if (Il > Ir_max) dl = Il - Ir_max; else dl = 0; if (Ir < Il_min) dr = Il_min - Ir; else if (Ir > Il_max) dr = Ir - Il_max; else dr = 0; d = MIN(dl, dr); if (params.data_cost==Parameters::L2) d = d*d; if (d>CUTOFF) d = CUTOFF; d_sum += d; return d_sum/3; } /************************************************************/ /******************* sub_pixel preprocessing ****************/ /************************************************************/ void Match::InitSubPixel() { if (params.sub_pixel && im_left && !im_left_min) { im_left_min = (GrayImage) imNew(IMAGE_GRAY, im_size.x, im_size.y); im_left_max = (GrayImage) imNew(IMAGE_GRAY, im_size.x, im_size.y); im_right_min = (GrayImage) imNew(IMAGE_GRAY, im_size.x, im_size.y); im_right_max = (GrayImage) imNew(IMAGE_GRAY, im_size.x, im_size.y); if (!im_left_min || !im_left_max || !im_right_min || !im_right_max) { fprintf(stderr, "Not enough memory!\n"); exit(1); } SubPixel(im_left, im_left_min, im_left_max); SubPixel(im_right, im_right_min, im_right_max); } if (params.sub_pixel && im_color_left && !im_color_left_min) { im_color_left_min = (RGBImage) imNew(IMAGE_RGB, im_size.x, im_size.y); im_color_left_max = (RGBImage) imNew(IMAGE_RGB, im_size.x, im_size.y); im_color_right_min = (RGBImage) imNew(IMAGE_RGB, im_size.x, im_size.y); im_color_right_max = (RGBImage) imNew(IMAGE_RGB, im_size.x, im_size.y); if (!im_color_left_min || !im_color_left_max || !im_color_right_min || !im_color_right_max) { fprintf(stderr, "Not enough memory!\n"); exit(1); } SubPixelColor(im_color_left, im_color_left_min, im_color_left_max); SubPixelColor(im_color_right, im_color_right_min, im_color_right_max); } } void Match::SubPixel(GrayImage Im, GrayImage ImMin, GrayImage ImMax) { Coord p; int I, I1, I2, I3, I4, I_min, I_max; for (p.y=0; p.y 0) I1 = (imRef(Im, p.x-1, p.y) + I) / 2; else I1 = I; if (p.x 0) I3 = (imRef(Im, p.x, p.y-1) + I) / 2; else I3 = I; if (p.y I1) I_min = I1; if (I_min > I2) I_min = I2; if (I_min > I3) I_min = I3; if (I_min > I4) I_min = I4; if (I_max < I1) I_max = I1; if (I_max < I2) I_max = I2; if (I_max < I3) I_max = I3; if (I_max < I4) I_max = I4; imRef(ImMin, p.x, p.y) = I_min; imRef(ImMax, p.x, p.y) = I_max; } } void Match::SubPixelColor(RGBImage Im, RGBImage ImMin, RGBImage ImMax) { Coord p; int I, I1, I2, I3, I4, I_min, I_max; for (p.y=0; p.y 0) I1 = (imRef(Im, p.x-1, p.y).r + I) / 2; else I1 = I; if (p.x 0) I3 = (imRef(Im, p.x, p.y-1).r + I) / 2; else I3 = I; if (p.y I1) I_min = I1; if (I_min > I2) I_min = I2; if (I_min > I3) I_min = I3; if (I_min > I4) I_min = I4; if (I_max < I1) I_max = I1; if (I_max < I2) I_max = I2; if (I_max < I3) I_max = I3; if (I_max < I4) I_max = I4; imRef(ImMin, p.x, p.y).r = I_min; imRef(ImMax, p.x, p.y).r = I_max; /* green component */ I = I_min = I_max = imRef(Im, p.x, p.y).g; if (p.x>0) I1 = (imRef(Im, p.x-1, p.y).g + I) / 2; else I1 = I; if (p.x 0) I3 = (imRef(Im, p.x, p.y-1).g + I) / 2; else I3 = I; if (p.y I1) I_min = I1; if (I_min > I2) I_min = I2; if (I_min > I3) I_min = I3; if (I_min > I4) I_min = I4; if (I_max < I1) I_max = I1; if (I_max < I2) I_max = I2; if (I_max < I3) I_max = I3; if (I_max < I4) I_max = I4; imRef(ImMin, p.x, p.y).g = I_min; imRef(ImMax, p.x, p.y).g = I_max; /* blue component */ I = I_min = I_max = imRef(Im, p.x, p.y).b; if (p.x>0) I1 = (imRef(Im, p.x-1, p.y).b + I) / 2; else I1 = I; if (p.x 0) I3 = (imRef(Im, p.x, p.y-1).b + I) / 2; else I3 = I; if (p.y I1) I_min = I1; if (I_min > I2) I_min = I2; if (I_min > I3) I_min = I3; if (I_min > I4) I_min = I4; if (I_max < I1) I_max = I1; if (I_max < I2) I_max = I2; if (I_max < I3) I_max = I3; if (I_max < I4) I_max = I4; imRef(ImMin, p.x, p.y).b = I_min; imRef(ImMax, p.x, p.y).b = I_max; } } /************************************************************/ /****************** smoothness penalty **********************/ /******************** (static clues) ************************/ /************************************************************/ int Match::smoothness_penalty_left_GRAY(Coord p, Coord np, Coord disp, Coord ndisp) { int d, R; if (disp == ndisp) return 0; if (disp.x == OCCLUDED || ndisp.x == OCCLUDED) R = params.interaction_radius; else { int Rx = disp.x - ndisp.x; if (Rx < 0) Rx = -Rx; int Ry = disp.y - ndisp.y; if (Ry < 0) Ry = -Ry; R = Rx + Ry; if (R > params.interaction_radius) R = params.interaction_radius; } d = IMREF(segm_left, p) - IMREF(segm_left, np); if (d<0) d = -d; if (d params.interaction_radius) R = params.interaction_radius; } d_max = 0; /* red component */ d = IMREF(segm_color_left, p).r - IMREF(segm_color_left, np).r; if (d<0) d = -d; if (d_max params.interaction_radius) R = params.interaction_radius; } d = IMREF(segm_right, p) - IMREF(segm_right, np); if (d<0) d = -d; if (d params.interaction_radius) R = params.interaction_radius; } d_max = 0; /* red component */ d = IMREF(segm_color_right, p).r - IMREF(segm_color_right, np).r; if (d<0) d = -d; if (d_max