将C# 的多个mat对象中数据,保存在一维数组中,最后在C++ 中复原这些mat对象,mat对象为单通道。
时间: 2024-02-09 19:09:45 浏览: 89
好的,以下是将多个单通道的Mat对象数据保存在一维数组中,并在C++中复原这些Mat对象的示例代码:
C# 代码:
```csharp
List<Mat> mats = new List<Mat>(); // 存储多个单通道的Mat对象
byte[] matDataBuffer = new byte[0]; // 存储所有Mat对象数据的一维数组
int matCount = mats.Count(); // Mat对象数量
int[] matSizes = new int[matCount * 2]; // 存储所有Mat对象的大小信息
int copiedSize = 0; // 已经拷贝的数据的大小
// 循环读取所有输入的Mat对象
for (int i_mat = 0; i_mat < matCount; i_mat++)
{
Mat mat = mats[i_mat];
// 适配单通道图像的问题,转成RGB
if (mat.Channels() == 1)
{
Cv2.CvtColor(mat, mat, ColorConversionCodes.GRAY2RGB);
}
// 获取Mat对象的大小信息
matSizes[i_mat * 2] = mat.Rows;
matSizes[i_mat * 2 + 1] = mat.Cols;
// 将Mat对象数据保存到一维数组中
byte[] matData = new byte[mat.Total() * mat.ElemSize()];
Marshal.Copy(mat.Data, matData, 0, matData.Length);
Array.Resize(ref matDataBuffer, copiedSize + matData.Length);
Array.Copy(matData, 0, matDataBuffer, copiedSize, matData.Length);
copiedSize += matData.Length;
}
// 将所有Mat对象数据和大小信息通过网络传输到C++端
```
C++ 代码:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
#include <Windows.h>
using namespace cv;
using namespace std;
void SetBGRValues(Mat& mat, BYTE* bgrValues, int& stride)
{
int rowBytes = mat.cols * mat.elemSize();
stride = rowBytes;
for (int i = 0; i < mat.rows; i++)
{
memcpy_s(mat.ptr(i), rowBytes, bgrValues + i * rowBytes, rowBytes);
}
}
int main()
{
int matCount; // Mat对象数量
int* matSizes; // 存储所有Mat对象的大小信息
BYTE* matDataBuffer; // 存储所有Mat对象数据的一维数组
int dataSize; // 存储所有Mat对象数据的大小
int copiedSize = 0; // 已经拷贝的数据的大小
// 接收所有Mat对象数据和大小信息
// ...
vector<Mat> mats; // 存储所有复原的Mat对象
// 循环复原所有Mat对象
for (int i_mat = 0; i_mat < matCount; i_mat++)
{
int rows = matSizes[i_mat * 2];
int cols = matSizes[i_mat * 2 + 1];
// 创建单通道Mat对象
Mat mat(rows, cols, CV_8UC1);
// 从一维数组中复原Mat对象数据
int stride;
int rowBytes = cols * mat.elemSize();
int imgBytes = rows * rowBytes;
BYTE* bgrValues = new BYTE[imgBytes];
memcpy_s(bgrValues, imgBytes, matDataBuffer + copiedSize, imgBytes);
SetBGRValues(mat, bgrValues, stride);
copiedSize += imgBytes;
delete[] bgrValues;
// 将单通道Mat对象转换为RGB格式
cvtColor(mat, mat, COLOR_GRAY2RGB);
// 将复原的Mat对象保存到vector中
mats.push_back(mat);
}
return 0;
}
```
需要注意的是,在C#中我们使用了 Marshal.Copy() 函数将Mat对象数据拷贝到了一维数组中,并使用 Array.Resize() 函数调整了数组的大小。在C++中我们使用了 memcpy_s() 函数将一维数组中的数据复制到了Mat对象中,并使用 delete[] 运算符释放了动态分配的内存。另外,在C++中我们使用了 Mat(rows, cols, CV_8UC1) 创建了单通道的Mat对象,然后使用 cvtColor() 函数将其转换为RGB格式。
阅读全文