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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2020-11-04 不错的pascal第三方库