2013-01-16 36 views
5

Tôi chỉ muốn sao chép kết quả như được đăng here.Làm cách nào để làm cho PerspectiveTransform hoạt động?

Tôi viết lại nguồn thành dạng EmguCV.

Image<Bgr, byte> image = new Image<Bgr, byte>(@"B:\perspective.png"); 

    CvInvoke.cvShowImage("Hello World!", image); 

    float[,] scrp = { { 43, 18 }, { 280,40}, {19,223 }, { 304,200} }; 
    float[,] dstp = { { 0,0}, { 320,0}, { 0,240 }, { 320,240 } }; 
    float[,] homog = new float[3, 3]; 


    Matrix<float> c1 = new Matrix<float>(scrp); 
    Matrix<float> c2 = new Matrix<float>(dstp); 
    Matrix<float> homogm = new Matrix<float>(homog); 


    CvInvoke.cvFindHomography(c1.Ptr, c2.Ptr, homogm.Ptr, Emgu.CV.CvEnum.HOMOGRAPHY_METHOD.DEFAULT, 0, IntPtr.Zero); 
    CvInvoke.cvGetPerspectiveTransform(c1, c2, homogm); 

    Image<Bgr, byte> newImage = image.WarpPerspective(homogm, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC, Emgu.CV.CvEnum.WARP.CV_WARP_DEFAULT, new Bgr(0, 0, 0)); 

    CvInvoke.cvShowImage("newImage", newImage); 

Đây là hình ảnh thử nghiệm. enter image description here

Hình ảnh mới luôn là hình ảnh trống.

Có ai có thể giúp tôi thực hiện công việc mã nguồn của mình không ???

Trả lời

4

Hy vọng rằng tôi tự tìm được câu trả lời.

Tôi viết lại nguồn ở dạng sai. Tôi nên sử dụng Điểm [] và có chức năng CameraCalibration.GetPerspectiveTransform để sử dụng.

PointF[] srcs = new PointF[4]; 
    srcs[0] = new PointF(253, 211); 
    srcs[1] = new PointF(563, 211); 
    srcs[2] = new PointF(563, 519); 
    srcs[3] = new PointF(253, 519); 


    PointF[] dsts = new PointF[4]; 
    dsts[0] = new PointF(234, 197); 
    dsts[1] = new PointF(520, 169); 
    dsts[2] = new PointF(715, 483); 
    dsts[3] = new PointF(81, 472); 

    HomographyMatrix mywarpmat = CameraCalibration.GetPerspectiveTransform(srcs, dsts); 
    Image<Bgr, byte> newImage = image.WarpPerspective(mywarpmat, Emgu.CV.CvEnum.INTER.CV_INTER_NN, Emgu.CV.CvEnum.WARP.CV_WARP_FILL_OUTLIERS, new Bgr(0, 0, 0)); 
+0

mát, tnx! Bạn có một ý tưởng làm thế nào tôi có thể nhận được tỷ lệ của các cạnh nếu tôi có một số hình ảnh với đối tượng hình chữ nhật? – Michael

+1

Bạn có ý nghĩa gì bởi "tỷ lệ của các cạnh"? Nếu bạn có nghĩa là các giá trị như 253, 211, bạn phải đo hình ảnh theo cách thủ công trong chương trình Paint hoặc các chương trình tương tự khác. – Gqqnbig

1

Dưới đây là một phương pháp mở rộng cho EmguCV phiên bản 3 (trong đó có nhiều chức năng bị phản đối):

public static Image<TColor, TDepth> GetAxisAlignedImagePart<TColor, TDepth>(
    this Image<TColor, TDepth> input, 
    Quadrilateral rectSrc, 
    Quadrilateral rectDst, 
    Size targetImageSize) 
    where TColor : struct, IColor 
    where TDepth : new() 
{ 
    var src = new[] { rectSrc.P0, rectSrc.P1, rectSrc.P2, rectSrc.P3 }; 
    var dst = new[] { rectDst.P0, rectDst.P1, rectDst.P2, rectDst.P3 }; 

    using (var matrix = CvInvoke.GetPerspectiveTransform(src, dst)) 
    { 
     using (var cutImagePortion = new Mat()) 
     { 
      CvInvoke.WarpPerspective(input, cutImagePortion, matrix, targetImageSize, Inter.Cubic); 
      return cutImagePortion.ToImage<TColor, TDepth>(); 
     } 
    } 
}