trufanov-nok / scantailor-universal

ScanTailor Universal - a fork based on Enhanced+Featured+Master versions of ST
http://scantailor.org
Other
183 stars 16 forks source link

CylindricalSurfaceDewarper.cpp (stable or nonstable)? #136

Open zvezdochiot opened 1 year ago

zvezdochiot commented 1 year ago

Hi @trufanov-nok .

Речь поведу за CylindricalSurfaceDewarper.cpp и поведу на русском.

Есть два очень похожих варианта построения цилиндрической модели: стабильный (stable) и нестабильный (nonstable).

Почему так названы варианты? Потому что у нестабильного периодически наблюдается сбой на нулевом столбце сетки и она дёргается или её скашивает и приходится доводить угловую точку, чтобы вернуть первые ячейки в нормальное состояние.

Какие ещё различия в вариантах? Стабильный вариант работает не так, как задумано. У него средняя линия всегда ровная, независимо от кривизны верхней и нижней линии сетки.

У вас испоьзуется стабильный вариант: https://github.com/trufanov-nok/scantailor-universal/blob/63f4c9d4774910817685bbf8ed7713b317dfdbb7/src/dewarping/CylindricalSurfaceDewarper.cpp#L119-L123 https://github.com/trufanov-nok/scantailor-universal/blob/63f4c9d4774910817685bbf8ed7713b317dfdbb7/src/dewarping/CylindricalSurfaceDewarper.cpp#L157-L161

Я же ни под какой "стабильностью" не подписывался. Мне нужно, чтобы деварп работал должным образом. Поэтому в STEX я использую нестабильный вариант:

    double const img_directrix1_proj(projector.projectionScalar(img_directrix1_pt));
    double const img_directrix2_proj(projector.projectionScalar(img_directrix2_pt));
    double const img_directrix0_proj = 0.5 * (img_directrix1_proj + img_directrix2_proj);
    Vec2d const img_straight_line_pt(m_pln2img(Vec2d(pln_x, img_directrix0_proj)));
    double const img_straight_line_proj(projector.projectionScalar(img_straight_line_pt));
    double const img_directrix1_proj(projector.projectionScalar(img_directrix1_pt));
    double const img_directrix2_proj(projector.projectionScalar(img_directrix2_pt));
    double const img_directrix0_proj = 0.5 * (img_directrix1_proj + img_directrix2_proj);
    Vec2d const img_straight_line_pt(m_pln2img(Vec2d(pln_x, img_directrix0_proj)));
    double const img_straight_line_proj(projector.projectionScalar(img_straight_line_pt));

PS: Исхожу из того, что m_plnStraightLineY всегда равен 0.5. При каких обстоятельствах он не равен 0.5? Мне неведомо. Сколько не дебажил, всегда выдаёт 0.5. На случай, когда такое всё-таки произойдёт, код можно переписать следующим образом:

    double const img_directrix1_proj(projector.projectionScalar(img_directrix1_pt));
    double const img_directrix2_proj(projector.projectionScalar(img_directrix2_pt));
    double const img_directrix0_proj = 0.5 * (img_directrix1_proj + img_directrix2_proj);
    double const img_directrix12f_proj = (1.0 - m_plnStraightLineY) * img_directrix1_proj
                                       + m_plnStraightLineY * img_directrix2_proj;
    Vec2d const img_straight_line_pt(m_pln2img(Vec2d(pln_x, img_directrix12f_proj)));
    double const img_straight_line_proj(projector.projectionScalar(img_straight_line_pt));
Различие в результатах деварпинга я уже публиковал на Ru.Board. STA (stable) vs STEX (nonstable)
st-dewarp-a st-dewarp-ex
Правая граница в стабильном варианте отрабатывается категорически не должным образом. Верхний контур легко "подправляется" клавишей [Del] и доводкой мышью

Такие вот дела.



PS: 600dpi: B199 B199_2R