emguCV实现仿射变换

  • 自带的函数
    采用自带的例如CvInvoke.GetRotationMatrix2D函数会生成非齐次的2X3矩阵。通过旋转中心、缩放、平移的参数可得一个Mat类型的值,该值与图像的Mat便可使得图像平移、缩放、旋转。
    Image<Bgr,byte> My_Image = new Image<Bgr, byte>("lena.jpg");            
            this.Size = My_Image.Size;
            Image<Gray, byte> gray_image = My_Image.Convert<Gray, byte>();  
      Mat AffineMat = new Mat();      
    //中心,旋转,比例
      CvInvoke.GetRotationMatrix2D(new PointF(gray_image.Cols / 2, gray_image.Rows / 2), 20, 1, AffineMat); 
       CvInvoke.WarpAffine(gray_image, gray_image, AffineMat,gray_image.Size,Inter.Cubic,Warp.FillOutliers,BorderType.Constant);
       pictureBox1.Image = gray_image.ToBitmap();
注意CvInvoke.WarpAffine函数需要指定插值的方法,可以当成因为缩放时像素丢失所必须做的插值运算。采用线性插值时速度最快,但容易产生锯齿。建议使用双线性插值。
  • 自生成矩阵运算
    矩阵的代表的含义可以自行百度链接

    -cmgucv数组可以直接转换矩阵,以下是对一个点做仿射变换。


//平移
     float x = 100;
     float y = 0;
     float[] PointOri = { x, y ,1};
     float offerX = 50,offerY = 0;
     float[,] AffineOffer = { { 1.0f,0.0f,offerX},
                              { 0.0f,1.0f,offerY},
                              { 0.0f,0.0f,1.0f} };
     //缩放
     float ScaleX = 1, ScaleY = 1;
     float[,] AffineScale = { { ScaleX,0.0f,0.0f},
                              { 0.0f,ScaleY,0.0f},
                              { 0.0f,0.0f,1.0f} };
     //绕某点旋转
     float a = -(float)Math.PI * (20.0f / 180.0f); //单位换算
     float CenterX = gray_image.Cols / 2, CenterY = gray_image.Rows / 2;
     float[,] AffineRotate = { { (float)Math.Cos(a),(float)-Math.Sin(a),(float)(CenterX-CenterX*Math.Cos(a)+CenterY*Math.Sin(a))},
                              { (float)Math.Sin(a),(float)Math.Cos(a),(float)(CenterY-CenterX*Math.Sin(a)-CenterY*Math.Cos(a))},
                              { 0.0f,0.0f,1.0f} };
     Matrix<Single> AffineOfferMat = new Matrix<float>(AffineOffer);
     Matrix<Single> AffineScaleMat = new Matrix<float>(AffineScale);
     Matrix<Single> AffineRotateMat = new Matrix<float>(AffineRotate);
     Matrix<Single> PointOriMat = new Matrix<float>(PointOri);

     Matrix<Single> PointMat = AffineRotateMat.Mul(AffineOfferMat);  //旋转+平移
     PointMat = AffineOfferMat.Mul(AffineScaleMat);  //旋转+平移+缩放
     PointMat = PointMat.Mul(PointOriMat);
     x = PointMat.Data[0, 0];
     y = PointMat.Data[1, 0];
     Cross2DF crossTest = new Cross2DF(new PointF(x, y), 30, 30);
     CvInvoke.WarpAffine(gray_image, gray_image, AffineMat,gray_image.Size,Inter.Cubic,Warp.FillOutliers,BorderType.Constant);
     gray_image.Draw(cross, new Gray(255), 1);
     gray_image.Draw(crossTest, new Gray(255), 1);
     pictureBox1.Image = gray_image.ToBitmap();
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值