|
れいさんのサンプルを色々試したのですが、うまくいきませんでした。
int src_x = 0;
int src_y = 0;
try
{
int a_a = int.Parse(txtAA.Text);
int a_b = int.Parse(txtAB.Text);
int a_c = int.Parse(txtAC.Text);
int a_d = int.Parse(txtAD.Text);
int b_x = int.Parse(txtBX.Text);
int b_y = int.Parse(txtBY.Text);
Bitmap src_bmp = (Bitmap)picSrc.Image;
Bitmap new_bmp = (Bitmap)picNew.Image;
{
for (int new_y = 0; new_y < picNew.Height - 1; new_y++)
{
for (int new_x = 0; new_x < picNew.Width - 1; new_x++)
{
if (new_bmp.GetPixel(new_x, new_y).ToArgb() != Color.Red.ToArgb())
continue;
int div_x = (a_a * a_d - a_b * a_c);
int div_y = (a_a * a_d - a_b * a_c);
if (div_x == 0 || div_y == 0)
continue;
src_x = ((new_x - b_x) * a_d - (new_y - b_y) * a_b) / div_x;
src_y = (-(new_x - b_x) * a_c + (new_y - b_y) * a_a) / div_y;
if (src_x < 0 || src_y < 0)
continue;
new_bmp.SetPixel(new_x, new_y, src_bmp.GetPixel(src_x, src_y));
}
}
picNew.Image = new_bmp;
}
}
catch (Exception ex)
{
MessageBox.Show("(" + src_x + "," + src_y + ")\n\n" + ex.Message);
}
そこで「OpenCvSharp」でごうさん紹介のサンプルを移植したら、簡単にできました。
#ライブラリの準備に時間掛かりましたが、移植は簡単でした。
CvPoint2D32f[] src_pnt = new CvPoint2D32f[4];
CvPoint2D32f[] dst_pnt = new CvPoint2D32f[4];
IplImage src_img = null;
IplImage dst_img = null;
CvMat map_matrix = null;
try
{
// (1)画像の読み込み,出力用画像領域の確保を行なう
Bitmap bmp = (Bitmap)picSrc.Image;
src_img = BitmapConverter.ToIplImage(bmp);
dst_img = Cv.CloneImage(src_img);
// (2)四角形の変換前と変換後の対応する頂点をそれぞれセットし
src_pnt[0] = new CvPoint2D32f(src_img.Width - 1, 0);
src_pnt[1] = new CvPoint2D32f(src_img.Width - 1, src_img.Height - 1);
src_pnt[2] = new CvPoint2D32f(0, src_img.Height - 1);
src_pnt[3] = new CvPoint2D32f(0, 0);
dst_pnt[0] = new CvPoint2D32f(points[0].X, points[0].Y);
dst_pnt[1] = new CvPoint2D32f(points[1].X, points[1].Y);
dst_pnt[2] = new CvPoint2D32f(points[2].X, points[2].Y);
dst_pnt[3] = new CvPoint2D32f(points[3].X, points[3].Y);
map_matrix = new CvMat(3, 3, MatrixType.F32C1);
map_matrix = Cv.GetPerspectiveTransform(src_pnt, dst_pnt);
// (3)指定された透視投影変換行列により,cvWarpPerspectiveを用いて画像を変換させる
Cv.WarpPerspective(src_img, dst_img, map_matrix,
Interpolation.Linear | Interpolation.FillOutliers, Cv.ScalarAll(100));
// (4)結果を表示する
picNew.Image = (dst_img.ToBitmap());
}
finally
{
if(src_img!= null)
Cv.ReleaseImage(src_img);
if (dst_img != null)
Cv.ReleaseImage(dst_img);
if (map_matrix != null)
Cv.ReleaseMat(map_matrix);
}
ありがとうございました。
テストApp
http://www.katsakuri.sakura.ne.jp/src/up47733.png.html
|