3.java openCV4.x 入门-数据类型(CvType)与Scalar

|------------------------------------------------------------------------------------------------------------------------------|---------------------------------|------------------------------------------------------------------------------------------------------|
| 专栏简介 |||
| 💒个人主页 📰专栏目录 点击上方查看更多内容 | 📖心灵鸡汤📖 我们唯一拥有的就是今天,唯一能把握的也是今天 | 🧭文章导航🧭 ⬆️2.hello openCV ⬇️4.待更新 |

数据类型(CvType)与Scalar

  • 一、CvType
    • 1.数据类型
    • 2.方法介绍
      • [1.channels​(int type)](#1.channels(int type))
      • [2.CV_8UC​(int ch)](#2.CV_8UC(int ch))
      • [3.depth​(int type)](#3.depth(int type))
      • [4. ELEM_SIZE​(int type)](#4. ELEM_SIZE(int type))
      • [5.isInteger​(int type)](#5.isInteger(int type))
      • [6. makeType​(int depth, int channels)](#6. makeType(int depth, int channels))
      • [7.typeToString​(int type)](#7.typeToString(int type))
  • 二、Scalar

上一节我们简单的了解了下数据类型,这里我们说下CvType类中的函数作用和Scalar对象

一、CvType

📢一个常量类,用于指定矩阵的数据类型和通道数。它提供了多种预定义的数据类型,例如 CV_8U(8位无符号整数)、CV_32F(32位浮点数)

1.数据类型

F 表示浮点数,S 表示有符号整数,U 表示无符号整数,C1...C4 表示单通道...四通道

2.方法介绍

示例已贴出,请自行验证

1.channels​(int type)

获取给定数据类型对应的通道数。

java 复制代码
        System.out.println("通道数= " + CvType.channels(CvType.CV_8SC4));

2.CV_8UC​(int ch)

给定一个通道数,创建换一个与之相应的数据类型,其它类似的函数作用是一样的,比如CV_16FC​(int ch)CV_32SC​(int ch)等方法。

java 复制代码
        Mat mat = new Mat(3,3,CvType.CV_8UC(3));

如示例所示,CvType.CV_8UC(3)等同于CvType.CV_8UC3

3.depth​(int type)

获取深度值,即获取对应的数据类型,返回一个int值。

java 复制代码
        CvType.depth(CvType.CV_8UC3);

如示例所示,返回的深度值为0,关于其它数据类型对应的值我们可以在jar包中找到,如下所示:

4. ELEM_SIZE​(int type)

获取给定数据类型每个元素的大小。元素大小是描述矩阵或数组元素类型的另一个组成部分,用于确定每个元素所需的存储空间。

例如,对于一些常见的数据类型,ELEM_SIZE(int type) 的返回值可能是:

对于 8 位无符号整数类型(如 CV_8UC1),返回值为 1,因为每个元素占用 1 字节。

对于 32 位浮点数类型(如 CV_32FC1),返回值为 4,因为每个元素占用 4 字节。

对于 64 位浮点数类型(如 CV_64FC1),返回值为 8,因为每个元素占用 8 字节。

java 复制代码
System.out.println("CvType.CV_8UC3 = " + CvType.ELEM_SIZE(CvType.CV_8UC3));

这里仅提供一个示例,请验证下其它数据类型的字节大小

5.isInteger​(int type)

判断数据类型是否为整数类型。

java 复制代码
 System.out.println("CvType.isInteger(CvType.CV_8UC1) = " + CvType.isInteger(CvType.CV_8UC1));
 System.out.println("CvType.isInteger(CvType.CV_16FC1) = " + CvType.isInteger(CvType.CV_16FC1));

6. makeType​(int depth, int channels)

根据指定的深度和通道数创建一个数据类型。

java 复制代码
 Mat mat = new Mat(3,3,CvType.makeType(CvType.CV_8U,1));

如示例所示CvType.makeType(CvType.CV_8U,1)等同于CvType.CV_8UC1等同于CvType.CV_8UC(1)

7.typeToString​(int type)

将给定的数据类型转换为对应的字符串表示形式

二、Scalar

Scalar类的作用包括:

表示颜色:

Scalar类可以用于表示颜色,可以通过指定蓝、绿、红三个分量的数值来表示一个颜色。例如,Scalar(255, 0, 0)表示蓝色,Scalar(0, 255, 0)表示绿色,Scalar(0, 0, 255)表示红色。

表示灰度值:

Scalar类也可以用于表示灰度颜色空间中的颜色,只需指定一个数值即可。例如,Scalar(128)表示灰度值为128的颜色。

总之,Scalar类是OpenCV中用于表示颜色的类,可以用于表示BGR颜色和灰度颜色,并且支持一些基本的运算。

1.构造函数

  v0,v1,v2,v3分别表示蓝色通道值、绿色通道值、红色通道值、透明度

2.方法介绍

比较简单的方法就不列举示例了。请自行验证

1.all​(double v)

创建一个具有相同值的Scalar对象

java 复制代码
 System.out.println("Scalar.all(10) = " + Scalar.all(10));

创建一个所有通道都是10的Scalar对象

2.clone()

创建并返回当前 Scalar 对象的一个副本。

3.conj()

返回一个共轭的Scalar对象。共轭在当前是指即具有相同信息(元素值)同时也具有与之对应信息(元素值)的两个对象。如下所示(示例仅用于演示,不考虑数据的合理性

java 复制代码
        Scalar scalar = new Scalar(1,2,3,4);
        Scalar conj = scalar.conj();
        System.out.println("scalar = " + scalar);
        System.out.println("conj = " + conj);

结果如下

bash 复制代码
scalar = [1.0, 2.0, 3.0, 4.0]
conj = [1.0, -2.0, -3.0, -4.0]

4.equals​(java.lang.Object obj)

比较两个Scalar对象是否相等

5.hashCode()

返回对象的哈希码值

6.⚠️isReal()

判断通道是否含有实数。这个函数有点特殊。我们查看源码

java 复制代码
    public boolean isReal() {
        return this.val[1] == 0.0 && this.val[2] == 0.0 && this.val[3] == 0.0;
    }

可以看出,它只判断v1,v2,v3通道全为0时返回true,不包含v0,这样的话,我们也可以用它判断是不是灰度值。请自行验证,这里就不举例了

7.mul​(Scalar it)

当前Scalar对象的每个分量与另一个Scalar对象的对应分量进行乘法运算

java 复制代码
        Scalar scalar = new Scalar(1,2,3,4);
        Scalar scalar_mum = new Scalar(1,2,3,4);
        Scalar mul = scalar.mul(scalar_mum);
        System.out.println("mul = " + mul);

结果

mul = [1.0, 4.0, 9.0, 16.0]

8.mul​(Scalar it, double scale)

对当前对象进行乘法运算,与上面方法不同的是,在进行乘法运算后,再对每个分量值与scale值进行乘法运算。请自行验证

9.set​(double[ ] vals)

设置Scalar值,接受的 是一个double对象,其中的值按顺序分别代表v0,v1,v2,v3的值

csharp 复制代码
        Scalar scalar = new Scalar(1,2,3,4);
        double [] vals = {2,3,4,5};
        scalar.set(vals);
相关推荐
皮皮林5511 小时前
使用 Java + WebSocket 实现简单实时双人协同 pk 答题
java·websocket
码小凡3 小时前
优雅!用了这两款插件,我成了整个公司代码写得最规范的码农
java·后端
掉鱼的猫4 小时前
Solon AI 五步构建 RAG 服务:2025 最新 AI + 向量数据库实战
java·redis·后端
java金融5 小时前
FactoryBean 和BeanFactory的傻傻的总是分不清?
java·后端
独立开阀者_FwtCoder5 小时前
Nginx 通过匹配 Cookie 将请求定向到特定服务器
java·vue.js·后端
名曰大神5 小时前
AEM6.5集成Redis详细步骤(附代码)
java·redis·demo·aem
带刺的坐椅5 小时前
Solon AI 五步构建 RAG 服务:2025 最新 AI + 向量数据库实战
java·redis·ai·solon·rag
东阳马生架构6 小时前
商品中心—7.自研缓存框架的技术文档
java
晴空月明8 小时前
线程安全与锁机制深度解析
java
天天摸鱼的java工程师10 小时前
你如何处理一个高并发接口的线程安全问题?说说你做过的优化措施
java·后端