使用Emgucv 读取bmp图片,将图片数据传入 C++dll中,并得到处理过的图片数据

本文介绍如何在C#中使用C++DLL进行图片处理,包括图片读取、转换及内存管理。通过托管与非托管代码的交互,实现图片算法的高效执行,并展示了在界面更新时的内存回收策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用C#来做界面以及图片的反复读取,为了利用C#的回收机制,不必担心内存泄漏问题

Image<Bgr, Byte> image = null;
Image<Bgr, Byte> outframe;

Bitmap bitmap;

MIplImage mlI;

foreach (var strImg in m_ImgList)

{

string strImgName = "图片路径/" + strImg ;

bitmap = new Bitmap(strImgName);

image = new Image<Bgr, Byte>(bitmap);

IntPtr ptrImg = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(image),

                    Emgu.CV.CvEnum.IplDepth.IplDepth_8U, image.Mat.NumberOfChannels);

CSharpAlg.ImgAlg(m_AlgPtr, image.Ptr, ptrImg);

//dll 接口定义: public static extern int ImgAlg(IntPtr pHandle, IntPtr pSrcImg, IntPtr pIplImg);

mlI = (MIplImage)Marshal.PtrToStructure(ptrImg, typeof(MIplImage));//托管与非托管的转换 

outframe =  new Image<Bgr, Byte>(mlI.Width, mlI.Height, mlI.WidthStep, mlI.ImageData);

// 在后台线程中进行C++ dll函数调用,使用代理进行界面图片显示

this.Invoke(new Action(() =>

{

    pbPicShow.Image = outframe.ToBitmap(); 

 }));

// 完成后进行内存释放;在后台线程执行完之前,不会进行回收,图片过多时会导致内存用完,new失败

CvInvoke.cvReleaseImage(ref ptrImg);
bitmap.Dispose();
image.Dispose();

}

// C++ dll的接口代码

ALG_DLL_EXP int __cdecl ImgAlg(ALG_HANDLE pHandle, IplImage* pSrc,

    IplImage* pImg)

{

int nRet = -1;

AlgClass* pAlg = (AlgClass*)pHandle;
*pImg = *pSrc;

cv::Mat imgMat(pImg);

nRet  = pAlg ->ImgAlg(imgMat);

*pImg = imgMat;

return nRet;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值