Menu

Wednesday, October 16, 2013

[EmguCV] การแปลงภาพแบบ Affine
[EmguCV] Affine Transformation

การแปลงภาพแบบ Affine คือ การฉายจุดลงบนฉากรับภาพตามแนวเส้นขนาน นั่นคือ การแปลงภาพที่ยังคงรักษาความขนานของเส้นเอาไว้
Affine transformation is the projection of points onto the image plane along parallel.

ขั้นแรก โหลดภาพตั้งต้นเข้าตัวแปร img
First, load a source image to img 
  1. Image<Bgr, byte> img = new Image<Bgr, byte>(image_path);
Source Image

ขั้นที่สอง ระบุพิกัดจุดทั้งสามภายในภาพตั้งต้น
Second, specify three points within source image
  1. PointF[] old_point=new PointF[3];
  2. old_point[0]=new PointF(61,95);
  3. old_point[1]=new PointF(267,95);
  4. old_point[2]=new PointF(61,250);

ขั้นที่สาม ระบุพิกัดจุดทั้งสามภายในภาพปลายทาง
Third, specify three points within destination image
  1. PointF[] new_point = new PointF[3];
  2. new_point[0] = new PointF(91, 95);
  3. new_point[1] = new PointF(297, 95);
  4. new_point[2] = new PointF(61, 250);

ขั้นต่อไป คำนวณเมทริกซ์การแปลง
Next, calculate transformation matrix
  1. RotationMatrix2D<double> mywarpmat = CameraCalibration.GetAffineTransform(old_point, new_point);

ขั้นต่อไป แปลงจากภาพตั้งต้นไปเป็นภาพปลายทาง โดยใช้เมทริกซ์การแปลง ในกรณีนี้ ภาพตั้งต้นและภาพปลายทางเป็นภาพเดียวกัน
Next, transform source image to destination image, in this case, source image and destination image are the same    
  1. img=img.WarpAffine(mywarpmat, INTER.CV_INTER_LINEAR, WARP.CV_WARP_FILL_OUTLIERS, new Bgr());

ถ้าภาพปลายทางต้องถูกตัดให้กว้าง width และสูง height ให้ใช้
If destination image must be cropped to width and height, use
  1. img = img.WarpAffine(mywarpmat, widthheight, INTER.CV_INTER_LINEAR, WARP.CV_WARP_FILL_OUTLIERS, new Bgr());

ขั้นสุดท้าย แสดงภาพปลายทางที่ทำการแปลงเรียบร้อยแล้ว
Finally, show a destination image 
  1. CvInvoke.cvShowImage("img", img.Ptr);
  2. CvInvoke.cvWaitKey(0);
Destination image

No comments:

Post a Comment