opencv与emgucv的参数传递

因为需要使用c#调用c++编写的dll,且dll中涉及OpenCV函数调用,因此参数的传递可以采用emgucv提供的接口,而不用傻乎乎的将c#中的结构转为字节,再在c++中重新转为opencv的结构。

Dll中的C++函数如下,功能就是彩色图像yuv空间的直方图均衡:

[cpp]  view plain  copy
  1. inthisto_enhance(IplImage* src, IplImage* dst)  
  2.  {  
  3.                   cv::Mat img = cv::cvarrToMat(src);  
  4.          std::vector<cv::Mat> out;  
  5.          cv::Mat kk;  
  6.          cv::cvtColor(img, kk, CV_BGR2YUV);  
  7.          cv::split(kk, out);  
  8.    
  9.          // 彩色直方图均衡过程  
  10.          cv::Mat colorimt;  
  11.          cv::Ptr<cv::CLAHE> clahe =cv::createCLAHE();  
  12.          clahe->setClipLimit(3);  
  13.          clahe->setTilesGridSize(cv::Size(8,8));  
  14.          // 对YUV中亮度通道进行直方图均衡  
  15.          kk = out[0];  
  16.          // colorimt为CLAHE处理后的亮度通道  
  17.          clahe->apply(kk, colorimt);  
  18.          out.at(0) = colorimt;  
  19.          cv::Mat cc;  
  20.          cv::merge(out, cc); // 将Y,U,V三个通道合并  
  21.          // cv::imshow("YUV",cc);  //YUV图  
  22.          // 需要把YUV格式转化回RGB格式  
  23.          cv::cvtColor(cc, colorimt, CV_YUV2BGR);  
  24.          IplImage tmp = colorimt;  
  25.          *dst = tmp;  
  26.          return 0;  
  27. }  


这里讲dst作为参数传递,而不是返回值,目的就是在c#代码内申请对象空间,否则在c++函数内 new出来的对象即使采用Marshal.PtrToStructure转换为托管代码,依然会有莫名其妙的错误。

C#中的相关调用代码如下:

[csharp]  view plain  copy
  1. IntPtr ptr = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(frame),Emgu.CV.CvEnum.IPL_DEPTH.  
  2. IPL_DEPTH_8U, 3);//申请空间后再作为参数传递  
  3. API.histo_enhance(frame.Ptr,ptr);//dll调用  
  4. MIplImage mlI =(MIplImage)Marshal.PtrToStructure(ptr, typeof(MIplImage));//托管与非托管的转换  
  5. Image<Bgr, Byte> outframe = newImage<Bgr, Byte>(mlI.width, mlI.height, mlI.widthStep, mlI.imageData);  


 

其中API定义如下:

[csharp]  view plain  copy
  1. public class API  
  2. {  
  3. [DllImport("dll名称",EntryPoint = "histo_enhance", CallingConvention =CallingConvention.Cdecl)]  
  4. public static extern inthisto_enhance(IntPtr src,IntPtr dst);  
  5. }  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值