貴重なソースコードの公開、ありがとうございます。 「射影変換(ホモグラフィ変換)で画像の台形や平行四辺形領域を長方形変換」のコードそのままで、 台形補正をしています。 完璧に成功する画像と、そうでない画像(台形側の右下が切れる、まったく変換できない)があります。 まったく変換できないときは、yy, xx の値が元のビットマップの範囲外になっています。 元画像は JPG です。 ScanLine, Pixels どちらを使っても同じ結果になります。 何かしら、ヒントでも頂けると非常に有難いです。
傾向として、画像サイズが大きい(カメラで撮影した画像)と失敗するようです。 画面に表示してキャプチャした画像だとほぼ大丈夫でした。
大きい画像を扱うと、値がオーバーフローしているようです。
procedure TForm1.Button2Click(Sender: TObject);
で a0、b0 を計算している箇所を以下に変えてみてください。
a0:=(
Extended(tmp[1].X+tmp[3].X-tmp[0].X-tmp[2].X)*(tmp[2].Y-tmp[3].Y)-
Extended(tmp[1].Y+tmp[3].Y-tmp[0].Y-tmp[2].Y)*(tmp[2].X-tmp[3].X)
)/
(ImgWidth*
(
Extended(tmp[2].X-tmp[1].X)*(tmp[2].Y-tmp[3].Y)-
Extended(tmp[2].Y-tmp[1].Y)*(tmp[2].X-tmp[3].X)
)
);
b0:=(
Extended(tmp[1].X+tmp[3].X-tmp[0].X-tmp[2].X)*(tmp[2].Y-tmp[1].Y)-
Extended(tmp[1].Y+tmp[3].Y-tmp[0].Y-tmp[2].Y)*(tmp[2].X-tmp[1].X)
)/
(ImgHeight*
(
Extended(tmp[2].X-tmp[3].X)*(tmp[2].Y-tmp[1].Y)-
Extended(tmp[2].Y-tmp[3].Y)*(tmp[2].X-tmp[1].X)
)
);>大きい画像を扱うと、値がオーバーフローしているようです。 mam 様、ありがとうございます。解決しました。 素晴らしいです!
