C# Opencvsharp中使用TransposeND函数
/模拟数据{1,2.........24}C++ 中代码 ,导出为DLL。C# 加载导出的dll。
Opencv的TransposeND函数在多维矩阵转置中很有用,但是在Opencvsharp和Emgucv中都没找到Opencv的TransposeND函数,于是将该函数导出DLL,如下:
C++ 中代码 ,导出为DLL
extern "C" __declspec(dllexport) void TransposeND(
Mat* srcMatPtr, Mat** dstMatPtr, int *order,int orderCount)
{
cv::Mat temp;
cv::transposeND(*srcMatPtr, std::vector<int>(order, order + orderCount), temp);
*dstMatPtr = new Mat(temp);
temp.release();
}
C# 加载导出的dll
[DllImport("D:\\opencv410\\x64\\Release\\opencv410.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern void TransposeND(IntPtr srcMatPtr, out IntPtr dstMatPtr, int []order,int orderCount);
private void TransposeNDTEST()
{
IntPtr resultsPtr;
int[] sizes= { 2,3,4};
int[] order = { 2,1,0};
float[] data = Enumerable.Range(1,2*3*4).Select(p=>(float)p).ToArray();//模拟数据{1,2.........24}
Mat mat3D = new Mat(sizes, MatType.CV_32FC1,data);
Stopwatch stopwatch = Stopwatch.StartNew();
TransposeND(mat3D.CvPtr,out resultsPtr,order,order.Length );
stopwatch.Stop();
float[] re = new float[data.Length];
Mat transPosedMat = new Mat(resultsPtr);
Marshal.Copy(transPosedMat.Data, re, 0, data.Length);
MessageBox.Show(string.Join("_", re) + " " + stopwatch.ElapsedMilliseconds + "ms");
}
效果如下:

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)