Calculate largest rectangle in a rotated rectangle

后端 未结 8 2271
你的背包
你的背包 2020-11-28 03:20

I\'m trying to find the best way to calculate the biggest (in area) rectangle which can be contained inside a rotated rectangle.

Some pictures should help (I hope) i

8条回答
  •  北海茫月
    2020-11-28 03:57

    Coproc solved this problem on another thread (https://stackoverflow.com/a/16778797) in a simple and efficient way. Also, he gave a very good explanation and python code there.

    Below there is my Matlab implementation of his solution:

    function [ CI, T ] = rotateAndCrop( I, ang )
    %ROTATEANDCROP Rotate an image 'I' by 'ang' degrees, and crop its biggest
    % inner rectangle.
    
    [h,w,~] = size(I);
    ang = deg2rad(ang);
    
    % Affine rotation
    R = [cos(ang) -sin(ang) 0; sin(ang) cos(ang) 0; 0 0 1];
    T = affine2d(R);
    B = imwarp(I,T);
    
    % Largest rectangle
    % solution from https://stackoverflow.com/a/16778797
    
    wb = w >= h;
    sl = w*wb + h*~wb;
    ss = h*wb + w*~wb;
    
    cosa = abs(cos(ang));
    sina = abs(sin(ang));
    
    if ss <= 2*sina*cosa*sl
        x = .5*min([w h]);
        wh = wb*[x/sina x/cosa] + ~wb*[x/cosa x/sina];
    else
        cos2a = (cosa^2) - (sina^2);
        wh = [(w*cosa - h*sina)/cos2a (h*cosa - w*sina)/cos2a]; 
    end
    
    hw = flip(wh);
    
    % Top-left corner
    tl = round(max(size(B)/2 - hw/2,1));
    
    % Bottom-right corner
    br = tl + round(hw);
    
    % Cropped image
    CI = B(tl(1):br(1),tl(2):br(2),:);
    

提交回复
热议问题