opencv提供了很多Mat的操作,其中涉及到两个重要的类:MatOp和MatExpr

  1. C++: MatExpr abs(const Mat& m)
  2. C++: void absdiff(InputArray src1, InputArray src2, OutputArray dst)
  3. C = abs(A-B) is equivalent to absdiff(A, B, C)
  4. C = abs(A) is equivalent to absdiff(A, Scalar::all(), C)
  5. C++: void add(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray(), int dtype=-)
  6. C++: void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, Out-
  7. putArray dst, int dtype=-)
  8. C++: void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray())
  9. C++: void bitwise_not(InputArray src, OutputArray dst, InputArray mask=noArray())
  10. C++: void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray())
  11. C++: void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray())
  12. C++: void calcCovarMatrix(const Mat* samples, int nsamples, Mat& covar, Mat& mean, int flags, int
  13. ctype=CV_64F)
  14. C++: void cartToPolar(InputArray x, InputArray y, OutputArray magnitude, OutputArray angle, bool an-
  15. gleInDegrees=false)
  16. C++: void magnitude(InputArray x, InputArray y, OutputArray magnitude)
  17. C++: bool checkRange(InputArray a, bool quiet=true, Point* pos=, double minVal=-DBL_MAX, double
  18. maxVal=DBL_MAX )
  19. C++: void compare(InputArray src1, InputArray src2, OutputArray dst, int cmpop)
  20. C++: void completeSymm(InputOutputArray mtx, bool lowerToUpper=false)
  21. C++: void convertScaleAbs(InputArray src, OutputArray dst, double alpha=, double beta=)
  22. C++: int countNonZero(InputArray src)
  23. C++: Mat cvarrToMat(const CvArr* arr, bool copyData=false, bool allowND=true, int coiMode= )
  24. C++: void dct(InputArray src, OutputArray dst, int flags=)
  25. C++: void idct(InputArray src, OutputArray dst, int flags=)
  26. C++: void dft(InputArray src, OutputArray dst, int flags=, int nonzeroRows=)
  27. C++: void idft(InputArray src, OutputArray dst, int flags=, int nonzeroRows=)
  28. C++: void divide(InputArray src1, InputArray src2, OutputArray dst, double scale=, int dtype=-)
  29. C++: double determinant(InputArray mtx)
  30. C++: bool eigen(InputArray src, OutputArray eigenvalues, int lowindex=-, int highindex=-)
  31. C++: void exp(InputArray src, OutputArray dst)
  32. C++: void extractImageCOI(const CvArr* arr, OutputArray coiimg, int coi=- )
  33. C++: void insertImageCOI(InputArray coiimg, CvArr* arr, int coi=- )
  34. C++: void flip(InputArray src, OutputArray dst, int flipCode)
  35. C++: void gemm(InputArray src1, InputArray src2, double alpha, InputArray src3, double gamma, OutputArray dst, int flags= )
  36. C++: ConvertData getConvertElem(int fromType, int toType)
  37. C++: int getOptimalDFTSize(int vecsize)
  38. C++: void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)
  39. C++: double invert(InputArray src, OutputArray dst, int flags=DECOMP_LU)
  40. C++: void log(InputArray src, OutputArray dst)
  41. C++: void LUT(InputArray src, InputArray lut, OutputArray dst, int interpolation= )
  42. C++: double Mahalanobis(InputArray v1, InputArray v2, InputArray icovar)
  43. C++: void max(InputArray src1, InputArray src2, OutputArray dst)

MatOp负责MatExpr的运算操作


  1. class CV_EXPORTS MatOp
  2. {
  3. public:
  4. MatOp();
  5. virtual ~MatOp();
  6.  
  7. virtual bool elementWise(const MatExpr& expr) const;
  8. virtual void assign(const MatExpr& expr, Mat& m, int type=-) const = ;
  9. virtual void roi(const MatExpr& expr, const Range& rowRange,
  10. const Range& colRange, MatExpr& res) const;
  11. virtual void diag(const MatExpr& expr, int d, MatExpr& res) const;
  12. virtual void augAssignAdd(const MatExpr& expr, Mat& m) const;
  13. virtual void augAssignSubtract(const MatExpr& expr, Mat& m) const;
  14. virtual void augAssignMultiply(const MatExpr& expr, Mat& m) const;
  15. virtual void augAssignDivide(const MatExpr& expr, Mat& m) const;
  16. virtual void augAssignAnd(const MatExpr& expr, Mat& m) const;
  17. virtual void augAssignOr(const MatExpr& expr, Mat& m) const;
  18. virtual void augAssignXor(const MatExpr& expr, Mat& m) const;
  19.  
  20. virtual void add(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res) const;
  21. virtual void add(const MatExpr& expr1, const Scalar& s, MatExpr& res) const;
  22.  
  23. virtual void subtract(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res) const;
  24. virtual void subtract(const Scalar& s, const MatExpr& expr, MatExpr& res) const;
  25.  
  26. virtual void multiply(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res, double scale=) const;
  27. virtual void multiply(const MatExpr& expr1, double s, MatExpr& res) const;
  28.  
  29. virtual void divide(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res, double scale=) const;
  30. virtual void divide(double s, const MatExpr& expr, MatExpr& res) const;
  31.  
  32. virtual void abs(const MatExpr& expr, MatExpr& res) const;
  33.  
  34. virtual void transpose(const MatExpr& expr, MatExpr& res) const;
  35. virtual void matmul(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res) const;
  36. virtual void invert(const MatExpr& expr, int method, MatExpr& res) const;
  37.  
  38. virtual Size size(const MatExpr& expr) const;
  39. virtual int type(const MatExpr& expr) const;
  40. };

  1. //modules/core/src/matop.cpp 定义了很多不同的操作,每种操作会重载部分函数
    class MatOp_Identity : public MatOp
  2. {
  3. public:
  4. MatOp_Identity() {}
  5. virtual ~MatOp_Identity() {}
  6.  
  7. bool elementWise(const MatExpr& /*expr*/) const { return true; }
  8. void assign(const MatExpr& expr, Mat& m, int type=-) const;
  9.  
  10. static void makeExpr(MatExpr& res, const Mat& m);
  11. };
  12.  
  13. static MatOp_Identity g_MatOp_Identity; //一种默认的MatOp
  14. static inline bool isIdentity(const MatExpr& e) { return e.op == &g_MatOp_Identity; }
  15.  
  16. class MatOp_T : public MatOp
  17. {
  18. public:
  19. MatOp_T() {}
  20. virtual ~MatOp_T() {}
  21.  
  22. bool elementWise(const MatExpr& /*expr*/) const { return false; }
  23. void assign(const MatExpr& expr, Mat& m, int type=-) const;
  24.  
  25. void multiply(const MatExpr& e1, double s, MatExpr& res) const;
  26. void transpose(const MatExpr& expr, MatExpr& res) const;
  27.  
  28. static void makeExpr(MatExpr& res, const Mat& a, double alpha=);
  29. };
  30.  
  31. static MatOp_T g_MatOp_T;
  32. static inline bool isT(const MatExpr& e) { return e.op == &g_MatOp_T; }
  33.  
  34. //其他函数的实现举例:
  1. void MatOp::add(const MatExpr& e1, const MatExpr& e2, MatExpr& res) const
  2. {
  3. if( this == e2.op )
  4. {
  5. double alpha = , beta = ;
  6. Scalar s;
  7. Mat m1, m2;
  8. if( isAddEx(e1) && (!e1.b.data || e1.beta == ) )
  9. {
  10. m1 = e1.a;
  11. alpha = e1.alpha;
  12. s = e1.s;
  13. }
  14. else
  15. e1.op->assign(e1, m1);
  16.  
  17. if( isAddEx(e2) && (!e2.b.data || e2.beta == ) )
  18. {
  19. m2 = e2.a;
  20. beta = e2.alpha;
  21. s += e2.s;
  22. }
  23. else
  24. e2.op->assign(e2, m2);
  25. MatOp_AddEx::makeExpr(res, m1, m2, alpha, beta, s);
  26. }
  27. else
  28. e2.op->add(e1, e2, res);
  29. }
  30.  
  31. void MatOp::add(const MatExpr& expr1, const Scalar& s, MatExpr& res) const
  32. {
  33. Mat m1;
  34. expr1.op->assign(expr1, m1);
  35. MatOp_AddEx::makeExpr(res, m1, Mat(), , , s);
  36. }
  37.  
  38. void MatOp::subtract(const MatExpr& e1, const MatExpr& e2, MatExpr& res) const
  39. {
  40. if( this == e2.op )
  41. {
  42. double alpha = , beta = -;
  43. Scalar s;
  44. Mat m1, m2;
  45. if( isAddEx(e1) && (!e1.b.data || e1.beta == ) )
  46. {
  47. m1 = e1.a;
  48. alpha = e1.alpha;
  49. s = e1.s;
  50. }
  51. else
  52. e1.op->assign(e1, m1);
  53.  
  54. if( isAddEx(e2) && (!e2.b.data || e2.beta == ) )
  55. {
  56. m2 = e2.a;
  57. beta = -e2.alpha;
  58. s -= e2.s;
  59. }
  60. else
  61. e2.op->assign(e2, m2);
  62. MatOp_AddEx::makeExpr(res, m1, m2, alpha, beta, s);
  63. }
  64. else
  65. e2.op->subtract(e1, e2, res);
  66. }
  67.  
  68. void MatOp::subtract(const Scalar& s, const MatExpr& expr, MatExpr& res) const
  69. {
  70. Mat m;
  71. expr.op->assign(expr, m);
  72. MatOp_AddEx::makeExpr(res, m, Mat(), -, , s);
  73. }


  1. //core/include/opencv2/core/mat.hpp
    class CV_EXPORTS MatExpr
  2. {
  3. public:
  4. MatExpr();
  5. explicit MatExpr(const Mat& m);
  6.  
  7. MatExpr(const MatOp* _op, int _flags, const Mat& _a = Mat(), const Mat& _b = Mat(),
  8. const Mat& _c = Mat(), double _alpha = , double _beta = , const Scalar& _s = Scalar());
  9.  
  10. operator Mat() const;
  11. template<typename _Tp> operator Mat_<_Tp>() const;
  12.  
  13. Size size() const;
  14. int type() const;
  15.  
  16. MatExpr row(int y) const;
  17. MatExpr col(int x) const;
  18. MatExpr diag(int d = ) const;
  19. MatExpr operator()( const Range& rowRange, const Range& colRange ) const;
  20. MatExpr operator()( const Rect& roi ) const;
  21.  
  22. MatExpr t() const;
  23. MatExpr inv(int method = DECOMP_LU) const;
  24. MatExpr mul(const MatExpr& e, double scale=) const;
  25. MatExpr mul(const Mat& m, double scale=) const;
  26.  
  27. Mat cross(const Mat& m) const;
  28. double dot(const Mat& m) const;
  29.  
  30. const MatOp* op;
  31. int flags;
  32.  
  33. Mat a, b, c;
  34. double alpha, beta;
  35. Scalar s;
  36. };
  37.  
  38. CV_EXPORTS MatExpr operator + (const Mat& a, const Mat& b);
  39. CV_EXPORTS MatExpr operator + (const Mat& a, const Scalar& s);
  40. CV_EXPORTS MatExpr operator + (const Scalar& s, const Mat& a);
  41. CV_EXPORTS MatExpr operator + (const MatExpr& e, const Mat& m);
  42. CV_EXPORTS MatExpr operator + (const Mat& m, const MatExpr& e);
  43. CV_EXPORTS MatExpr operator + (const MatExpr& e, const Scalar& s);
  44. CV_EXPORTS MatExpr operator + (const Scalar& s, const MatExpr& e);
  45. CV_EXPORTS MatExpr operator + (const MatExpr& e1, const MatExpr& e2);
  46.  
  47. CV_EXPORTS MatExpr operator - (const Mat& a, const Mat& b);
  48. CV_EXPORTS MatExpr operator - (const Mat& a, const Scalar& s);
  49. CV_EXPORTS MatExpr operator - (const Scalar& s, const Mat& a);
  50. CV_EXPORTS MatExpr operator - (const MatExpr& e, const Mat& m);
  51. CV_EXPORTS MatExpr operator - (const Mat& m, const MatExpr& e);
  52. CV_EXPORTS MatExpr operator - (const MatExpr& e, const Scalar& s);
  53. CV_EXPORTS MatExpr operator - (const Scalar& s, const MatExpr& e);
  54. CV_EXPORTS MatExpr operator - (const MatExpr& e1, const MatExpr& e2);
  55.  
  56. CV_EXPORTS MatExpr operator - (const Mat& m);
  57. CV_EXPORTS MatExpr operator - (const MatExpr& e);
  58.  
  59. CV_EXPORTS MatExpr operator * (const Mat& a, const Mat& b);
  60. CV_EXPORTS MatExpr operator * (const Mat& a, double s);
  61. CV_EXPORTS MatExpr operator * (double s, const Mat& a);
  62. CV_EXPORTS MatExpr operator * (const MatExpr& e, const Mat& m);
  63. CV_EXPORTS MatExpr operator * (const Mat& m, const MatExpr& e);
  64. CV_EXPORTS MatExpr operator * (const MatExpr& e, double s);
  65. CV_EXPORTS MatExpr operator * (double s, const MatExpr& e);
  66. CV_EXPORTS MatExpr operator * (const MatExpr& e1, const MatExpr& e2);
  67.  
  68. CV_EXPORTS MatExpr operator / (const Mat& a, const Mat& b);
  69. CV_EXPORTS MatExpr operator / (const Mat& a, double s);
  70. CV_EXPORTS MatExpr operator / (double s, const Mat& a);
  71. CV_EXPORTS MatExpr operator / (const MatExpr& e, const Mat& m);
  72. CV_EXPORTS MatExpr operator / (const Mat& m, const MatExpr& e);
  73. CV_EXPORTS MatExpr operator / (const MatExpr& e, double s);
  74. CV_EXPORTS MatExpr operator / (double s, const MatExpr& e);
  75. CV_EXPORTS MatExpr operator / (const MatExpr& e1, const MatExpr& e2);
  76.  
  77. CV_EXPORTS MatExpr operator < (const Mat& a, const Mat& b);
  78. CV_EXPORTS MatExpr operator < (const Mat& a, double s);
  79. CV_EXPORTS MatExpr operator < (double s, const Mat& a);
  80.  
  81. CV_EXPORTS MatExpr operator <= (const Mat& a, const Mat& b);
  82. CV_EXPORTS MatExpr operator <= (const Mat& a, double s);
  83. CV_EXPORTS MatExpr operator <= (double s, const Mat& a);
  84.  
  85. CV_EXPORTS MatExpr operator == (const Mat& a, const Mat& b);
  86. CV_EXPORTS MatExpr operator == (const Mat& a, double s);
  87. CV_EXPORTS MatExpr operator == (double s, const Mat& a);
  88.  
  89. CV_EXPORTS MatExpr operator != (const Mat& a, const Mat& b);
  90. CV_EXPORTS MatExpr operator != (const Mat& a, double s);
  91. CV_EXPORTS MatExpr operator != (double s, const Mat& a);
  92.  
  93. CV_EXPORTS MatExpr operator >= (const Mat& a, const Mat& b);
  94. CV_EXPORTS MatExpr operator >= (const Mat& a, double s);
  95. CV_EXPORTS MatExpr operator >= (double s, const Mat& a);
  96.  
  97. CV_EXPORTS MatExpr operator > (const Mat& a, const Mat& b);
  98. CV_EXPORTS MatExpr operator > (const Mat& a, double s);
  99. CV_EXPORTS MatExpr operator > (double s, const Mat& a);
  100.  
  101. CV_EXPORTS MatExpr operator & (const Mat& a, const Mat& b);
  102. CV_EXPORTS MatExpr operator & (const Mat& a, const Scalar& s);
  103. CV_EXPORTS MatExpr operator & (const Scalar& s, const Mat& a);
  104.  
  105. CV_EXPORTS MatExpr operator | (const Mat& a, const Mat& b);
  106. CV_EXPORTS MatExpr operator | (const Mat& a, const Scalar& s);
  107. CV_EXPORTS MatExpr operator | (const Scalar& s, const Mat& a);
  108.  
  109. CV_EXPORTS MatExpr operator ^ (const Mat& a, const Mat& b);
  110. CV_EXPORTS MatExpr operator ^ (const Mat& a, const Scalar& s);
  111. CV_EXPORTS MatExpr operator ^ (const Scalar& s, const Mat& a);
  112.  
  113. CV_EXPORTS MatExpr operator ~(const Mat& m);
  114.  
  115. CV_EXPORTS MatExpr min(const Mat& a, const Mat& b);
  116. CV_EXPORTS MatExpr min(const Mat& a, double s);
  117. CV_EXPORTS MatExpr min(double s, const Mat& a);
  118.  
  119. CV_EXPORTS MatExpr max(const Mat& a, const Mat& b);
  120. CV_EXPORTS MatExpr max(const Mat& a, double s);
  121. CV_EXPORTS MatExpr max(double s, const Mat& a);
  122.  
  123. CV_EXPORTS MatExpr abs(const Mat& m);
  124. CV_EXPORTS MatExpr abs(const MatExpr& e);
  125.  
  126. } // cv

  1. MatExpr::MatExpr(const Mat& m) : op(&g_MatOp_Identity), flags(), a(m), b(Mat()), c(Mat()), alpha(), beta(), s(Scalar())
  2. {
      //默认使用的是g_MatOp_Identity
  3. }
  4. MatExpr MatExpr::diag(int d) const
  5. {
  6. MatExpr e;
  7. op->diag(*this, d, e);
  8. return e;
  9. }
  10. MatExpr MatExpr::t() const
  11. {
  12. MatExpr e;
  13. op->transpose(*this, e);
  14. return e;
  15. }
  16. MatExpr operator + (const Mat& a, const Mat& b)
  17. {
  18. MatExpr e;
  19. MatOp_AddEx::makeExpr(e, a, b, , );
  20. return e;
  21. }
  1. class MatOp_AddEx : public MatOp
  2. {
  3. public:
  4. MatOp_AddEx() {}
  5. virtual ~MatOp_AddEx() {}
  6.  
  7. bool elementWise(const MatExpr& /*expr*/) const { return true; }
  8. void assign(const MatExpr& expr, Mat& m, int type=-) const;
  9.  
  10. void add(const MatExpr& e1, const Scalar& s, MatExpr& res) const;
  11. void subtract(const Scalar& s, const MatExpr& expr, MatExpr& res) const;
  12. void multiply(const MatExpr& e1, double s, MatExpr& res) const;
  13. void divide(double s, const MatExpr& e, MatExpr& res) const;
  14.  
  15. void transpose(const MatExpr& e1, MatExpr& res) const;
  16. void abs(const MatExpr& expr, MatExpr& res) const;
  17.  
  18. static void makeExpr(MatExpr& res, const Mat& a, const Mat& b, double alpha, double beta, const Scalar& s=Scalar());
  19. };
  20.  
  21. static MatOp_AddEx g_MatOp_AddEx;
    inline void MatOp_AddEx::makeExpr(MatExpr& res, const Mat& a, const Mat& b, double alpha, double beta, const Scalar& s)
    {
        res = MatExpr(&g_MatOp_AddEx, 0, a, b, Mat(), alpha, beta, s);
    }
  1.  
  1.  

opencv MatExpr MatOp的更多相关文章

  1. OpenCV MAT基本图像容器

    参考博客: OpenCv中cv::Mat和IplImage,CvMat之间的转换 Mat - 基本图像容器 Mat类型较CvMat和IplImage有更强的矩阵运算能力,支持常见的矩阵运算(参照Mat ...

  2. opencv 61篇

    (一)--安装配置.第一个程序 标签: imagebuildincludeinputpathcmd 2011-10-21 16:16 41132人阅读 评论(50) 收藏 举报  分类: OpenCV ...

  3. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨)  ...

  4. OpenCV源码阅读(3)---base.hpp

    base.h处于core模块中,是OpenCV的核心类.其作用是定义了OpenCV的基本错误类型,在程序运行出现错误是抛出错误,防止数据溢出.总而言之,其功能主要是考虑程序的健壮性. 头文件 #ifn ...

  5. 图像储存容器Mat[OpenCV 笔记11]

    IplImage 与 Mat IplImage是OpenCV1中的图像存储结构体,基于C接口创建.在退出之前必须release,否则就会造成内存泄露.在一些只能使用C语言的嵌入式系统中,不得不使用. ...

  6. OpenCV中Mat的详解

    每次碰到Mat都得反复查具体的用法,网上的基础讲解不多,难得看到一篇,赶快转来收藏~ 原文地址:http://www.opencvchina.com/thread-1039-1-1.html 目标 我 ...

  7. OPENCV第一篇

    了解过之前老版本OpenCV的童鞋们都应该清楚,对于OpenCV1.0时代的基于 C 语言接口而建的图像存储格式IplImage*,如果在退出前忘记release掉的话,就会照成内存泄露.而且用起来超 ...

  8. 相机标定 matlab opencv ROS三种方法标定步骤(2)

    二  ubuntu下Opencv的相机标定 一般直接用Opencv的源码就可以进行相机的标定,但是可能只是会实现结果,却不懂实现的过程,我也是模模糊糊的看了<计算机视觉中的多视图几何>以及 ...

  9. OpenCV中的结构体、类与Emgu.CV的对应表

    OpenCv中的 C 结构 OpenCV中的 C++ 封装 Emgu.CV中的 C# 封装 OpenCV 和 Emgu.CV 中的结构罗列 谢谢阅读,有误希望指正 原文地址 Basic Structu ...

随机推荐

  1. javascript 高级编程系列 - 继承

    1. 原型链继承 (缺点:子类继承父类的引用类型的属性值会在各个实例中共享,创建子类实例时无法向父类构造函数传递参数) // 定义父类构造函数 function SuperClass(father, ...

  2. upstart man

    man upstart nit(8) init(8) NAME init - Upstart process management daemon SYNOPSIS init [OPTION]... D ...

  3. .NET MVC 4 实现邮箱激活账户功能

    这篇文章是<.NET MVC 4 实现用户注册功能>的后续开发,实现发送激活链接到注册用户邮箱,用户在邮箱打开链接后激活账户的功能. 首先实现发送邮件的功能,在管理用户注册的control ...

  4. windows常用命令(转载)

    1.最基本,最常用的,测试物理网络的  ping 192.168.0.8 -t ,参数-t是等待用户去中断测试 2.查看DNS.IP.Mac等  A.Win98:winipcfg  B.Win2000 ...

  5. VLC For Android Ubuntu14.04编译环境搭建

    VLC多媒体播放器(英语:VLC media player,最初为VideoLAN Client.是VideoLAN计划的开放源码多媒体播放器.)支持众多音频与视频解码器及文件格式,并支持DVD影音光 ...

  6. EasyDarwin开源摄像机访问EasyCamera中海康摄像头语音对讲和云台控制转发实现

    转自:http://blog.csdn.net/yanzhuomin/article/details/52887311 EasyCamera中关于摄像头SDK的调用都集中在EasyCameraSour ...

  7. Node.js安装及环境配置(windows)

    1.Node.js简介 简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用 ...

  8. ABAP- INCLUDE Zxxx IF FOUND.

    大顾代码: INCLUDE zinc_ca_0002 IF FOUND. - 这肯定是大顾问写出来的 - 一般都不会加东西啊 -加了 IF FOUND 不知道啥意思.  古道无仙(173120830) ...

  9. Mac终端操作SVN指令

    1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录)   例如:svn checkout svn://192.168.1.1/pro/domain    ...

  10. CSS3学习笔记(3)—左右飞入的文字

    前几天看到一个企业招聘的动画觉得很炫,里面有个企业介绍的文字是用飞入的效果做出来的,今天尝试了写了一下,感觉还不错~\(≧▽≦)/~啦啦啦 下面来看我做的动态效果: 其实上面的效果很简单的,我的截图软 ...