C# 如何马歇尔cvMat和CV_MAT_ELEM

C# 如何马歇尔cvMat和CV_MAT_ELEM,c#,opencv,pinvoke,marshalling,C#,Opencv,Pinvoke,Marshalling,我试图在c#中使用一些openCV Ml函数,但我不想使用emugcv,因为我的老师不允许,所以我尝试使用p/invoke来整理这两行代码。 (哦,我应该使用普通dll还是d.dll??) 我应该使用通话约定吗 CVAPI(CvMat*) cvCreateMat( int rows, int cols, int type );//header def CvMat * rowtest = cvCreateMat(1,5,CV_32FC1); 这一个我有 [DllImportAtt

我试图在c#中使用一些openCV Ml函数,但我不想使用emugcv,因为我的老师不允许,所以我尝试使用p/invoke来整理这两行代码。 (哦,我应该使用普通dll还是d.dll??) 我应该使用通话约定吗

   CVAPI(CvMat*)  cvCreateMat( int rows, int cols, int type );//header def
    CvMat * rowtest = cvCreateMat(1,5,CV_32FC1);
这一个我有

[DllImportAttribute("opencv_ml242.dll.dll", EntryPoint="cvCreateMat")]
public static extern  IntPtr cvCreateMat(int dims, const ref int sizes, int type);

   #define CV_MAT_ELEM( mat, elemtype, row, col )           \
(*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))

   #define CV_MAT_ELEM_PTR_FAST( mat, row, col, pix_size )  \
(assert( (unsigned)(row) < (unsigned)(mat).rows &&   \
         (unsigned)(col) < (unsigned)(mat).cols ),   \
 (mat).data.ptr + (size_t)(mat).step*(row) + (pix_size)*(col))
编辑: 我找到了一些东西给cv_mat_elem

   public static void CV_MAT_ELEM(ref Image<Gray, float> mat, Type elemtype, int row, int col, float val)
    {
        MCvMat cvMat = new MCvMat();
        cvMat.data = mat;

        CV_MAT_ELEM_PTR_FAST(ref cvMat, row, col, sizeof(float), val);

    public static void CV_MAT_ELEM_PTR_FAST(ref MCvMat mat, int row, int col, int pix_size, float val)
    {
        unsafe
        {
            int sz = sizeof(float);
            if (row < mat.rows)
            {
                if (col < mat.cols)
                {
                   IntPtr x = new IntPtr(&mat.data + sz * mat.step * row + sz * col);
                }
            }
        }        }
public static void CV_MAT_ELEM(参考图像MAT,类型elemtype,int row,int col,float val)
{
MCvMat cvMat=新的MCvMat();
cvMat.data=mat;
CV_MAT_ELEM_PTR_FAST(参考cvMat、row、col、sizeof(float)、val);
公共静态无效CV_材料元素PTR_快速(参考MCvMat材料、整行、整列、整像素尺寸、浮点值)
{
不安全的
{
int sz=sizeof(浮动);
if(行<材料行)
{
如果(列<物料列)
{
IntPtr x=新的IntPtr(&mat.data+sz*mat.step*row+sz*col);
}
}
}        }

编辑:使用带有opencv函数的DLL解决问题,只希望我不会失去性能。

使用带有opencv函数的DLL解决问题,只希望我不会失去性能

   public static void CV_MAT_ELEM(ref Image<Gray, float> mat, Type elemtype, int row, int col, float val)
    {
        MCvMat cvMat = new MCvMat();
        cvMat.data = mat;

        CV_MAT_ELEM_PTR_FAST(ref cvMat, row, col, sizeof(float), val);

    public static void CV_MAT_ELEM_PTR_FAST(ref MCvMat mat, int row, int col, int pix_size, float val)
    {
        unsafe
        {
            int sz = sizeof(float);
            if (row < mat.rows)
            {
                if (col < mat.cols)
                {
                   IntPtr x = new IntPtr(&mat.data + sz * mat.step * row + sz * col);
                }
            }
        }        }