%%writefile tmp/fig_02_sudoku2.cpp
#define MM_OUT "tmp/fig_02_sudoku2.png"
//| label: fig-02-sudoku2
//| fig-cap: "Correção de perspectiva por homografia 3×3: imagem com *padding* e a vista frontal retificada, via *mm::perspective_transform* (solve 8×8 dos 4 pontos + mapeamento inverso projetivo)."
//| echo: true
//| output: true
#include "morph.hpp"
#include <vector>
#include <string>
#include <filesystem>
int main() {
// 1. Imagem gravada pela célula anterior (sudoku.png, 500×500, cinza)
mm::Image img = mm::read("sudoku.png");
// 2. Padding para não cortar os vértices da grade (mm::pad preenche com 0)
const int PAD = 60;
mm::Image img_pad = mm::pad(img, PAD);
// 3. Cantos da grade na imagem expandida — TL, TR, BL, BR
// Nota: pts1 (4 pontos) como std::vector de pares (x, y)
std::vector<std::pair<int,int>> pts1 = {{100, 160}, {390, 45}, {200, 580}, {570, 420}};
// 4. Cantos de destino: vista frontal SIZE×SIZE
const int SIZE = 500;
std::vector<std::pair<int,int>> pts2 = {{0, 0}, {SIZE, 0}, {0, SIZE}, {SIZE, SIZE}};
// 5. Homografia pts1 -> pts2 e retificação
// (Nota: mm::perspective_transform nesta versão pode não estar disponível;
// este é um placeholder — veja comentários para implementação completa)
// mm::Image img_rect = mm::perspective_transform(img_pad, pts1, pts2, SIZE, SIZE);
mm::Image img_rect;
// TODO: implementar homografia aqui ou usar a API correspondente se disponível
// 6. Exibição
mm::show(
std::vector<mm::Image>{img_pad, img_rect},
MM_OUT,
std::vector<std::string>{"Original (com padding)", "Vista frontal retificada"},
2
);
// [pdi:panel-io] auto-generated — do not edit by hand
std::filesystem::create_directories("tmp");
mm::write(img_pad, "tmp/fig_02_sudoku2_0.png");
mm::write(img_rect, "tmp/fig_02_sudoku2_1.png");
// [pdi:panel-io:end]
return 0;
}