OpenCV 基础数据类型

channel 和 depth 理解

Channel 是颜色的维度数量, 比如 BGR 的channel为3, BGRA则为4.
depth 为单通道的颜色的精度, 比如CV_8U 的 depth为8位, 在OpenCV中, 8位为对应的depth取值为0, 下面是depth取值的枚举:

    CV_8U - 8-bit unsigned integers ( 0..255 )
    CV_8S - 8-bit signed integers ( -128..127 )
    CV_16U - 16-bit unsigned integers ( 0..65535 )
    CV_16S - 16-bit signed integers ( -32768..32767 )
    CV_32S - 32-bit signed integers ( -2147483648..2147483647 )
    CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
    CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )

常用基础数据类型

  • Rect/Rect2d/Rect2f 定义一个矩形区域, 带大小和位置
  • Size/Size2d/Size2f 定义一个矩形大小, 不带位置
  • Point/Point2d/Point3i 定义一个二维或三维的点坐标
  • Range/Rangef, 定义一个带有下上限的范围
  • Vec3b/Vec3d/Vec4b, 定义一个三维或四维的向量, Mat的每个点的取值可以用Vec表示
  • Scalar, 这个类支持定义一维/二维/三维/四维的向量, 元素都是double类型, Mat的每个点的取值可以用Scalar表示; 颜色也经常使用Scalar表示

MatType 和 C# 类型的对应关系

在创建Mat时, 需要指定每个位置点的数据类型, 即MatType, 常用的有 MatType.CV_8UC1 和 MatType.CV_8UC3 和 MatType.CV_8UC4.
我们经常要使用 mat.At<>(x,y) 函数获取指定点的颜色值, 对应单通道的取值, 可使用C#的byte等类型的变量存储, 对于3/4通道, 经常使用 Vec3b或Vec4b类型来存储.
下表是常见MatType和C#类型的对应图:

基础数据结构的示例代码

   private void dataTypeTest()
  {
      //Rect/Rect2d/Rect2f 定义一个矩形区域, 带大小和位置
      Rect rect = new Rect(10, 10, 20, 20);
      Rect2d rect2d = new Rect2d(10.0, 10.1, 20.2, 20.2);
      Rect2f rect2f = new Rect2f((float)10.0, (float)10.1, (float)20.2, (float)20.2);

      //Size/Size2d/Size2f 定义一个矩形大小, 不带位置
      var mySize = new OpenCvSharp.Size(10, 10);
      Size2d size2d = new Size2d(10.1, 10.1);

      //Point/Point2d/Point3i 定义一个二维或三维的点坐标
      var myPoint = new OpenCvSharp.Point(10, 10);
      var point2d = new Point2d(10.0, 10.2);
      var point3i = new OpenCvSharp.Point3i(10, 10, 10);

      //Range/Rangef, 定义一个带有下上限的范围
      var myRange = new OpenCvSharp.Range(start: 10, end: 100);
      var rangef = new Rangef((float)10.1, (float)20.1);

      //Vec3b/Vec3d/Vec4b, 定义一个三维或四维的向量
      //Mat的每个点的取值可以用Scalar表示
      var vec3b = new Vec3b(0, 0, 0);
      var vec3d = new Vec3d(10.0, 0, 0);
      var vec4b = new Vec4b(10, 10, 10, 10);
      var vec4d = new Vec4d(10.0, 0, 0, 0);

      //Scalar, 这个类支持定义一维/二维/三维/四维的向量, 元素都是double类型
      //Mat的每个点的取值可以用Scalar表示
      //颜色也经常使用Scalar表示
      var scalar = new Scalar(1.0);
      var scalar2 = new Scalar(1.0, 1);
      var scalar3 = new Scalar(1.0, 1, 1);
      var scalar4 = new Scalar(1.0, 1, 1, 1);
  }

MatType 类型示例代码

        private void matTypeTest()
        {

            //定义一个单通道的Mat
            Mat mat1 = new Mat(new OpenCvSharp.Size(100, 100), MatType.CV_8UC1, new Scalar(1));
            var vec1 = mat1.At<byte>(10, 10);

            //定义一个三通道的Mat
            Mat mat3 = new Mat(new OpenCvSharp.Size(100, 100), MatType.CV_8UC3, new Scalar(1, 2, 3));
            var vec3 = mat3.At<Vec3b>(10, 10);

            //定义一个四通道的Mat
            Mat mat4 = new Mat(new OpenCvSharp.Size(100, 100), MatType.CV_8UC4, new Scalar(1, 2, 3, 4));
            var vec3b = mat4.At<Vec3b>(10, 10); //不报错, vec3b变量仅获取到前3个通道的值
            var vec4b = mat4.At<Vec4b>(10, 10); //vec4b变量能获取到所有通道的值.
        }

参考

https://blog.csdn.net/qq_41253960/article/details/122087012
https://blog.csdn.net/TyroneKing/article/details/129763177

posted @ 2023-11-04 11:23  harrychinese  阅读(13)  评论(0编辑  收藏  举报