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

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

概述本文章向大家介绍使用Emgucv 读取bmp图片,将图片数据传入 C++dll中,并得到处理过的图片数据,主要包括使用Emgucv 读取bmp图片,将图片数据传入 C++dll中,并得到处理过的图片数据使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

Image image = null;


Image outframe;

Bitmap bitmap;

MIplimage mli;

foreach (var strimg in m_imgList)

{

string strimgname = "图片路径/" + strimg ;

bitmap = new Bitmap(strimgname);

image = new Image(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(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;

}

总结

以上是内存溢出为你收集整理的使用Emgucv 读取bmp图片,将图片数据传入 C++dll中,并得到处理过的图片数据全部内容,希望文章能够帮你解决使用Emgucv 读取bmp图片,将图片数据传入 C++dll中,并得到处理过的图片数据所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1264418.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存