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.youkuaiyun.com/qq_41253960/article/details/122087012https://blog.youkuaiyun.com/TyroneKing/article/details/129763177

OpenCV 中的 `cv::Mat` 是用于存储图像的数据类型,是 OpenCV 用来记录大型数组的主要类型,可视为 OpenCV 所有 C++ 实现的核心,OpenCV 所有主要函数都是 `cv::Mat` 类的成员,或是将 `cv::Mat` 作为参数,或是返回一个 `cv::Mat` 类型 [^1][^3]。 相较于以往的 `IplImage` 类型,`Mat` 类型省去了人工管理内存,转而自动分配释放。`IplImage` 是从 OpenCV1.0 到目前表示一个图像的结构体,之前的图像用 `IplImage` 表示,且之前的 OpenCV 是用 C 语言编写,提供的也是 C 语言接口 [^1][^4]。 `cv::Mat` 类用于表示任意维度的稠密数组。“稠密”意味着该数组的所有部分都有一个值存储,即使这个值是 0;大多数图像以稠密数组的形式存储。与之对应的是稀疏数组,用于存储只有非 0 的数值,不过在数组比较稠密时,稀疏数组会浪费大量内存 [^3]。 `Mat` 类包含一个矩阵头以及一个指向矩阵的指针 [^1]。在定义 `Mat` 时,可以指定 `type`,如 `Mat::Mat(int rows, int cols, int type, const Scalar& s)`,其中 `s` 表示要初始的值。判断一个矩阵元素的类型可使用 `type()` 函数 [^5]。 创建与初始化 `Mat` 有多种方法,例如: ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { int rows = 3, cols = 1; cv::Size size(cols, rows); // 第一种创建方式 cv::Mat myMat1(rows, cols, CV_8UC1, cv::Scalar(0)); cv::Mat myMat2 = cv::Mat(rows, cols, CV_8UC1, cv::Scalar(0)); cv::Mat myMat3(size, CV_8UC1, cv::Scalar(0)); cv::Mat myMat4(cv::Size(cols, rows), CV_8UC1, cv::Scalar(0)); // 第二种创建方式 cv::Mat myMat5; myMat5 = cv::Mat(rows, cols, CV_8UC1); cv::Mat myMat6; myMat5.copyTo(myMat6); cv::Point3i pts(1, 2, 3); cv::Mat myMat7 = cv::Mat(pts, true); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值