darknet原始碼解讀-letterbox_image
阿新 • • 發佈:2019-02-14
letterbox_image對影象調整成輸入尺寸(w,h)
//將原圖進行一定比例的縮放,返回的圖片尺寸為(w,h) image letterbox_image(image im, int w, int h) { int new_w = im.w; int new_h = im.h; //在保證影象寬高比不變的情況下,計算放縮後的寬高 if (((float)w/im.w) < ((float)h/im.h)) { //這個說明高度比例大於寬度比例,所以new_h要重新設定 new_w = w; new_h = (im.h * w)/im.w; } else { new_h = h; new_w = (im.w * h)/im.h; } image resized = resize_image(im, new_w, new_h); image boxed = make_image(w, h, im.c); fill_image(boxed, .5); //填充,why 0.5?相當於127,灰度! //int i; //for(i = 0; i < boxed.w*boxed.h*boxed.c; ++i) boxed.data[i] = 0; //將放縮後的圖片複製入boxed圖片正中央 embed_image(resized, boxed, (w-new_w)/2, (h-new_h)/2); free_image(resized); //resized儲存的是圖片放縮的中間結果,臨時用 return boxed; //返回的影象尺寸為需要的(w,h) }
按照偏移(dx,dy)將source中的影象移動到dest中,source和dest都是darknet中自定義的image結構,儲存影象的基本資訊,以及
通過一維陣列的形式儲存了影象的原始資料(可能是標準化後的資料)。
//move image from source to dest according to the offset (dx,dy) void embed_image(image source, image dest, int dx, int dy) { int x,y,k; for(k = 0; k < source.c; ++k){ for(y = 0; y < source.h; ++y){ for(x = 0; x < source.w; ++x){ //channel->height->width float val = get_pixel(source, x,y,k); set_pixel(dest, dx+x, dy+y, k, val); } } } }