zoukankan      html  css  js  c++  java
  • Mat_类

    Mat_类是对 Mat 类的一个包装,其定义如下:

    template<typename _Tp> class Mat_ : public Mat
    {
    public:
        //只定义了几个方法
        //没有定义新的属性
    };

    这是一个非常轻量级的包装, 既然已经有 Mat 类, 为何还要定义一个 Mat_?
    下面我们看这段代码:

    Mat M(600, 800, CV_8UC1);
    for( int i = 0; i < M.rows; ++i)
    {
        uchar * p = M.ptr<uchar>(i);
        for( int j = 0; j < M.cols; ++j )
        {
            double d1 = (double) ((i+j)%255);
            M.at<uchar>(i,j) = d1;
            double d2 = M.at<double>(i,j);//此行有错
        }
    }

    在读取矩阵元素时,以及获取矩阵某行的地址时,需要指定数据类型。这样首先需要不停地写“<uchar>” ,让人感觉很繁琐,在繁琐和烦躁中容易犯错,如上面代码中的错误,用 at()获取矩阵元素时错误的使用了 double 类型。这种错误不是语法错误,因此在编译时编译器不会提醒。在程序运行时,at()函数获取到的不是期望的(i,j)位置处的元素, 数据已经越界, 但是运行时也未必会报错。 这样的错误使得你的程序忽而看上去正常,忽而弹出“段错误” ,特别是在代码规模很大时,难以查错。 如果使用 Mat_类,那么就可以在变量声明时确定元素的类型,访问元素时不再需要指定元素类型,即使得代码简洁,又减少了出错的可能性。上面代码可以用 Mat_实现,实现代码如下面例程里的第二个双重 for 循环。

    #include<iostream>
    #include"opencv2/opencv.hpp"
    #include<stdio.h>
    using namespace std;
    using namespace cv;
    int main(int argc, char *argv[])
    {
     Mat M(600,800,CV_8UC1);
     for (int i = 0; i < M.rows; ++i)
     {
      //获取指针时需要指定类型
      uchar *p = M.ptr<uchar>(i);
      for (int j = 0; j < M.cols; ++j)
      {
       double dl = (double)((i+j)%255);
       //用at()读写像素时,需要指定类型
       M.at<uchar>(i, j) = dl;
       //下面代码错误,应该使用at<uchar>()
       //但编译时不会提醒错误
      // double d2 = M.at<double>(i,j);
      }
     }
     //在变量声明时指定矩阵元素类型
     Mat_<uchar> M1 = (Mat_<uchar>&)M;
     for (int i = 0; i < M1.rows; ++i)
     {
      //不需要指定元素类型,语句简洁
      uchar *p = M1.ptr(i);
      for (int j = 0; j < M1.cols; ++j)
      {
       double d1 = (double)((i+j)%255);
       //直接使用Matlab风格的矩阵元素读写,简洁
       M1(i, j) = d1;
       double d2 = M1(i,j);
      }
     }
     imshow("M1",M1);
     imshow("M", M);
     waitKey(0);
     return 0;
    }

  • 相关阅读:
    while for循环
    Python模块
    python内置函数
    【简介】《GM/T 0034-2014 基于SM2密码算法的证书认证系统密码及其相关安全技术规范》
    Markdown的Diagrams
    密码设备管理-对称密钥管理
    TortoiseSVN的简单使用
    Android Studio安装后的设置
    Android Studio升级后,新建Activity后setContentView(R.layout.activity_layout_main);中R变红
    简介Floyd算法
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6558409.html
Copyright © 2011-2022 走看看