Можешь попробовать найти контур, а потом использовать cv2.minAreaRect() для поиска минимального повёрнутого ограничивающего прямоугольника. minAreaRect() тебе вернёт кортеж вида
(cx, cy), (w, h), angle
, где cx, cy - координаты центра, w, h - размеры прямоугольника, angle - угол поворота в градусах.
Имей ввиду, что отношение w/h будет близко к единице для квадратов, но не обязательно равно единице. Тебе придётся выбрать какой-то порог отсечения.
А ещё посоветую ознакомиться вот с
этой статьёй, там тоже интересный подход.