###前提・実現したいこと
c++で射影変換をするプログラムを作っております。(Eigen導入)
できれば、opencv等のライブラリは導入しない方向です。
###発生している問題・エラーメッセージ
変換後の画像が変換したい四角形におさまらず、歪んだ画像になってしまいます。
元画像...256 * 256
###該当のソースコード
//指摘された通りに内容を変更しました
void getSystem(POINTd* in,POINTd* out,double *ht) {//8個のパラメータを求める
Matrix<double, 8 , 8> dATA;
dATA<< in[0].x, in[0].y, 1, 0, 0, 0, -out[0].x * in[0].x, -out[0].x * in[0].y,
in[1].x, in[1].y, 1, 0, 0, 0, -out[1].x * in[1].x, -out[1].x * in[1].y,
in[2].x, in[2].y, 1, 0, 0, 0, -out[2].x * in[2].x, -out[2].x * in[2].y,
in[3].x, in[3].y, 1, 0, 0, 0, -out[3].x * in[3].x, -out[3].x * in[3].y,
0, 0, 0, in[0].x, in[0].y, 1, -out[0].y * in[0].x, -out[0].y * in[0].y,
0, 0, 0, in[1].x, in[1].y, 1, -out[1].y * in[1].x, -out[1].y * in[1].y,
0, 0, 0, in[2].x, in[2].y, 1, -out[2].y * in[2].x, -out[2].y * in[2].y,
0, 0, 0, in[3].x, in[3].y, 1, -out[3].y * in[3].x, -out[3].y * in[3].y;
dATA = dATA.inverse();
for (int i = 0; i < 8; i++) {
ht[i] = 0;
for (int j = 0; j < 4; j++) {
ht[i] +=
dATA(i, j) * out[j].x;
}
for (int j = 0; j < 4; j++) {
ht[i] +=
dATA(i, j + 4) * out[j].y;
}
}
}
void draw(){//求めたパラメータから実際にイメージ(DIB)に描画する
/* 変数の定義など */
double ht[8] = { 0 };
getSystem(pointin, pointout,ht);
for(int x = 0;x < image_src.Width;x++){
for(int y = 0;y < image_src.Height;y++){
int x1 = (double)x * ht[0] + (double)y * ht[1] + ht[2] /
((double)x * ht[6] + (double)y * ht[7] + 1.0);
int y1 = (double)x * ht[3] + (double)y * ht[4] + ht[5] /
((double)x * ht[6] + (double)y * ht[7] + 1.0);
if (x1 > Width)x1 = 0;
if (y1 > Height)y1 = 0;
if (x1 < 0)x1 = 0;
if (y1 < 0)y1 = 0;
lpPixel_target[x1 + y1 * Width] = image_src.GetPixel(x,y);
}
}
}
###試したこと
参考サイト:
http://yaju3d.hatenablog.jp/entry/2013/08/04/152524
http://mf-atelier.sakura.ne.jp/mf-atelier/modules/tips/program/algorithm/a6.html
ネットで調べる限り調べましたが、結果は変わりませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
visualstudio 2015 c++
Eigen導入済み
回答3件
あなたの回答
tips
プレビュー