emguCV实现仿射变换
来源:互联网 发布:jq遍历json数组 编辑:程序博客网 时间:2024/05/18 00:51
- 自带的函数
采用自带的例如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 0
- emguCV实现仿射变换
- EmguCV Image类中的函数(三)几种边缘检测算法和仿射变换
- OpenCV实现仿射变换
- OpenCV实现仿射变换
- 仿射变换及OpenCV实现
- MATLAB上实现仿射变换
- OpenCV实现仿射变换--通过三个点进行变换
- matlab利用仿射变换实现图片的旋转变换
- 图像的等距变换,相似变换,仿射变换,射影变换及其matlab实现
- 图像的等距变换,相似变换,仿射变换,射影变换及其matlab实现
- 仿射变换&透视变换
- 几何变换 -- 仿射变换
- 【翻译】仿射变换
- 仿射变换
- 仿射变换
- 仿射变换
- 仿射变换
- 仿射变换
- 一、计算机网络之TCP/IP协议
- Jquery实现$.fn.extend和$.extend函数
- Jquery练习题—实现分组添加功能
- 程序4
- SQL查询入门(下篇)
- emguCV实现仿射变换
- Java运算符详解
- hdu 2680 Choose the best route (最短路问题 dijkstra | spfa)
- 二、计算机网络之网络访问层
- js实现*号三角形及菱形
- Centos 6.5 x64升级SSH到OpenSSH_6.6p1完整步骤
- 《Linux黑客的Python编程之道》学习笔记-1
- 解决maven内存溢出问题
- C/S和B/S两种架构区别与优缺点分析