
使用C#来做界面以及图片的反复读取,为了利用C#的回收机制,不必担心内存泄漏问题
Image
Image
Bitmap bitmap;
MIplimage mli;
foreach (var strimg in m_imgList)
{
string strimgname = "图片路径/" + strimg ;
bitmap = new Bitmap(strimgname);
image = new Image
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
// 在后台线程中进行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;
}
总结以上是内存溢出为你收集整理的使用Emgucv 读取bmp图片,将图片数据传入 C++dll中,并得到处理过的图片数据全部内容,希望文章能够帮你解决使用Emgucv 读取bmp图片,将图片数据传入 C++dll中,并得到处理过的图片数据所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)