''' [DllImport(@"cvdll.dll", EntryPoint = "readimg")]
extern static void readimg([MarshalAs(UnmanagedType.LPArray)] byte[] bt, int cols, int rows,int size);
'''
''' int cols, rows;
Bitmap bmp = new Bitmap("D:\\C++代码\\数字图像处理\\lena.bmp");
cols = bmp.Height;rows = bmp.Width;
MemoryStream Ms = new MemoryStream();
bmp.Save(Ms, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] bt = new byte[Ms.Length];
MessageBox.Show(Ms.Length.ToString());
Ms.Position = 0;
Ms.Read(bt, 0, Convert.ToInt32(Ms.Length));
int Size = Convert.ToInt32(Ms.Length);
Ms.Close();
readimg( bt, cols, rows,Size);
'''
将bmp转化为Memorystream,再转化为byte[],然后传递给c++进行处理.
c++的unsigned char*对应C#的UnmanagedType.LPArray)] byte[] 。
'''
extern "C" __declspec(dllexport) void _stdcall show(char* name);
extern "C" __declspec(dllexport) void _stdcall readimg(uchar * data, int cols, int rows, int size);
using namespace cv;
void _stdcall show(char* name) {
Mat img = imread(name);
if (img.empty()) {
printf("can not open");
}
else{
imshow("test",img);
waitKey(0);
}
}
void _stdcall readimg(uchar* data, int cols,int rows,int size){
FILE* f = fopen("2.bmp", "wb");
fwrite(data, 1, size,f);
fclose(f);
Mat img = imread("2.bmp");
Mat img2=img.clone();
imwrite("12.bmp", img2);
MessageBoxA(0, "4", 0, 0);
imshow(" ", img);
MessageBoxA(0, "5", 0, 0);
}
'''
Messagebox是我用来调试的..
imdecode函数可以将内存中的图像转换为Mat,但是查了资料显示他内部实现也用了fopen,我干脆就用fopen了。
另外一种方案是传递图像的像素数组,
C#中使用lockbit,然后将指向图像数据的指针bmpdata.scano传递给c++,使用memcpy函数把数据复制到opencv 的Mat.data中
c#图像是四字节对齐的,而opencv的Mat不是。(假如图像宽511,c#中图像数据每行有512个,直接传递给c++会出问题)