c#与c++Mat传参

先上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)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值