1. 程式人生 > >darknet原始碼解讀-letterbox_image

darknet原始碼解讀-letterbox_image

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);
            }
        }
    }
}