先上C++部分代码
法一
EXTERN_CMYOPENCV_API void GetMat(uchar *data, size_t&size)
{
std::vectorbuf;
cv::Mat src = cv::imread("D:\\1.jpg"); //读入一个Mat
cv::imencode(".bmp", src, buf); //将Mat以bmp格式存入内存中,转换为uchar数组
size = buf.size();
foreach (uchar var in buf) //将buf拷贝到C#的输出byte[] 内存中
{
*data = var;
data++;
}
}
再来C#代码
[DllImport(@"myopencv.dll")]
externstaticvoid GetMat(refbyte data,outulong size); //将byte的起始地址传入
public Form1()
{
InitializeComponent(); //C#窗口初始化,默认的
byte[] ptrData = newbyte[2048*2048*3]; //尽可能大的byte[]
ulong size = newulong();
GetMat(ref ptrData[0],out size); //将C++的内存数据转入C#的内存中
pictureBox1.Image = Image.FromStream(new MemoryStream(ptrData,0,(int)size));
//将byte[]转化为MemoryStream再传递给image
}
至此完成Mat到C#image的数据转换
法二
cv::Mat getMatImg(unsigned char* src, ImageParams imageParams)
{
int format;
switch (imageParams.channel)
{
case 1:
format = CV_8UC1;
break;
case 2:
format = CV_8UC2;
break;
case 3:
format = CV_8UC3;
break;
default:
format = CV_8UC4;
break;
}
cv::Mat image = cv::Mat(imageParams.height, imageParams.width, format, src);
return image;
}
typedef struct
{
int width;
int height;
int channel;
}ImageParams;
int funff(unsigned char* bitmap, ImageParams imageParams) {
Mat SrcImg = getMatImg(bitmap, imageParams);
[DllImport("cudaInfer.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int funff(byte[] bitmap, ImageParams imageParams);
public struct ImageParams
{
public int width;
public int height;
public int channel;
};
public byte[] GetBGRValues(Bitmap bmp)
{
var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
var bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
var rowBytes = bmpData.Width * System.Drawing.Image.GetPixelFormatSize(bmp.PixelFormat) / 8;
var imgBytes = bmp.Height * rowBytes;
byte[] rgbValues = new byte[imgBytes];
IntPtr ptr = bmpData.Scan0;
for (var i = 0; i < bmp.Height; i++)
{
Marshal.Copy(ptr, rgbValues, i * rowBytes, rowBytes);
ptr += bmpData.Stride; // next row
}
bmp.UnlockBits(bmpData);
return rgbValues;
}
byte[] source = GetBGRValues(bmp);
ImageParams imageParams;
imageParams.channel = System.Drawing.Image.GetPixelFormatSize(bmp.PixelFormat) / 8;
imageParams.width = bmp.Width;
imageParams.height = bmp.Height;
int r1 = funff(source, imageParams)