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");

}

效果如下:

Logo

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

更多推荐