OpenCV выпрямляет изображение с помощью Python


person rbo13    schedule 02.02.2017    source источник
comment
Это возможно только в том случае, если вы знаете угол поворота или знаете точку ограничения прямоугольника.   -  person ZdaR    schedule 02.02.2017
comment
Что вы имеете в виду под граничной точкой?   -  person rbo13    schedule 02.02.2017
comment
Розовая рамка, ограничивающая границы ваших книг   -  person ZdaR    schedule 02.02.2017
comment
@ZdaR Я изменю это на основе розовой коробки?   -  person rbo13    schedule 02.02.2017


Ответы (1)


Помните мой предыдущий пост? Этот ответ основан на этом.

Итак, я получил 4 угловые точки ограничивающей рамки вокруг книги и передал их в функцию гомографии.

Код:

#---- 4 corner points of the bounding box
pts_src = np.array([[17.0,0.0], [77.0,5.0], [0.0, 552.0],[53.0, 552.0]])

#---- 4 corner points of the black image you want to impose it on
pts_dst = np.array([[0.0,0.0],[77.0, 0.0],[ 0.0,552.0],[77.0, 552.0]])

#---- forming the black image of specific size
im_dst = np.zeros((552, 77, 3), np.uint8)

#---- Framing the homography matrix
h, status = cv2.findHomography(pts_src, pts_dst)

#---- transforming the image bound in the rectangle to straighten
im_out = cv2.warpPerspective(im, h, (im_dst.shape[1],im_dst.shape[0]))
cv2.imwrite("im_out.jpg", im_out)

введите описание изображения здесь

Поскольку у вас есть ограничивающая рамка контура вокруг книги; вы должны передать эти 4 точки в массив pts_src.

person Jeru Luke    schedule 02.02.2017
comment
аааа ладно... Никогда не думал, что смогу применить это в таком сценарии. Спасибо приятель. Только один вопрос, как вы получили это значение? pts_src = np.array([[17.0,0.0], [77.0,5.0], [0.0, 552.0],[53.0, 552.0]]) pts_dst = np.array([[0.0,0.0],[77.0, 0.0],[ 0.0,552.0],[77.0, 552.0]]) im_dst = np.zeros((552, 77, 3), np.uint8) - person rbo13; 02.02.2017
comment
Я вручную нарисовал круги по углам ограничивающей рамки. Все, что вам нужно сделать, это получить эти точки из контура, который вы получили. - person Jeru Luke; 02.02.2017
comment
Как мне получить точки из моего контура? Потому что, когда я его печатаю, он возвращает коллекцию. И я не знаю, с чего начать. Надеюсь, вы можете дать мне предложение. Очень признателен. - person rbo13; 02.02.2017
comment
как вы находили и рисовали контуры? После нахождения контуров примените к контуру следующий код: rect = cv2.minAreaRect(cnt); box = cv2.boxPoints(rect); box = np.int0(box). Четыре угла будут внутри box. См. ЭТОТ ДОКУМЕНТ для получения дополнительной информации - person Jeru Luke; 02.02.2017
comment
Привет @JeruLuke. Я буду кормить box в cv2.findHomography() ? Вот мой прогресс по этой ссылке. - person rbo13; 03.02.2017
comment
@whaangbuu Да, углы коробки, в которой вы хотите разместить изображение, должны быть переданы pts_dst из cv2.findHomography() - person Jeru Luke; 03.02.2017
comment
@whaangbuu Я видел твой код. Вы не использовали свойство ограничивающая рамка. Посетите ограничивающий прямоугольник на ЭТА СТРАНИЦА. Он создает прямоугольник вокруг вашего контура. Этот прямоугольник содержит точки контура. Вы можете вставить эти точки в pts_dst в коде :D - person Jeru Luke; 03.02.2017