Menu

Wednesday, October 9, 2013

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

การแปลงภาพแบบ Perspective คือ การฉายจุดลงบนฉากรับภาพตามแนวเส้นที่พุ่งออกมาจากจุดจุดหนึ่งที่เรียกว่า จุดศูนย์กลางการฉาย
Perspective transformation is the projection of points onto the image plane along lines that emanate from a single point, called the center of projection.

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

ขั้นที่สอง ระบุพิกัดจุดหรือมุมทั้งสี่ภายในภาพตั้งต้น
Second, specify four points/corners within source image
  1. PointF[] old_corner = new PointF[4];
  2. old_corner[0] = new PointF(90, 80);
  3. old_corner[1] = new PointF(39, 262);
  4. old_corner[2] = new PointF(294, 281);
  5. old_corner[3] = new PointF(231, 70);

ขั้นที่สาม ระบุพิกัดจุดหรือมุมทั้งสี่ภายในภาพปลายทาง
Third, specify four points/corners within destination image
  1. PointF[] new_corner = new PointF[4];
  2. new_corner[0] = new PointF(0, 0);
  3. new_corner[1] = new PointF(0, 350);
  4. new_corner[2] = new PointF(350, 350);
  5. new_corner[3] = new PointF(350, 0);

ขั้นต่อไป คำนวณเมทริกซ์การแปลง
Next, calculate transformation matrix
  1. HomographyMatrix mywarpmat = CameraCalibration.GetPerspectiveTransform(old_corner, new_corner);

ขั้นต่อไป แปลงจากภาพตั้งต้นไปเป็นภาพปลายทาง โดยใช้เมทริกซ์การแปลง ในกรณีนี้ ภาพตั้งต้นและภาพปลายทางเป็นภาพเดียวกัน
Next, transform source image to destination image, in this case, source image and destination image are the same     
  1. img = img.WarpPerspective(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.WarpPerspective(mywarpmat, width, height, 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