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

浙公網安備 33010602011771號