由于与项目相关的几个限制而不是特别是这个问题,我试图通过PInvoke传递一个结构,其中包含与C#上位图的Mat构造函数相关的数据。
在C#中,我收到一个名为frame的Bitmap,并且为了访问我正在做的像素数据:
BitmapData data = frame.LockBits(new Rectangle(0,0,frame.Width,frame.Height), ImageLockMode.ReadWrite, frame.PixelFormat);
使用data.Scan0
作为IntPtr
我为非托管dll创建结构。显然,在调用我的外部函数后,我调用frame.UnlockBits(data);
这是代码
C#调用
[DllImport("ImageProcessingExtern", CallingConvention = CallingConvention.Cdecl)]
public static extern void drawLine(IntPtr objPtr, ref ExportBitmap bitmap);
C#Struct声明
[StructLayout(LayoutKind.Sequential, Pack=8)]
public struct ExportBitmap
{
public int height;
public int width;
public IntPtr data;
public int step;
public int channels;
}
C ++函数声明
CVAPI(void) drawLine(ObjectsFinder* objPtr, ExportBitmap* bitmap) {
cv::Mat testmat(cv::Size(bitmap->width, bitmap->height), CV_MAKETYPE(CV_8U, bitmap->channels), bitmap->data, bitmap->step);
}
C ++ Struct
#pragma pack(push, 8)
typedef struct ExportBitmap
{
int height;
int width;
void* data;
int step;
int channels;
} ExportBitmap;
#pragma pack(pop)
到目前为止,只要我没有创建那个垫子,我的代码就可以工作了。如果我修改除IntPtr内部数据之外的任何参数,一切正常。当使用Mat构造函数行时,我得到一个错误,说DLL不是有效的Win32应用程序(来自kernel32 LoadLibrary()的错误代码193)
我已经被困了大约两周寻找解决方案,我仍然不确定发生了什么,我只能认为我是如何获得可编辑的位图数据的问题,但是我不确定它的问题是什么。