opencv与emgucv的参数传递

原创 2015年11月20日 16:18:00

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

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

inthisto_enhance(IplImage* src, IplImage* dst)
 {
                  cv::Mat img = cv::cvarrToMat(src);
         std::vector<cv::Mat> out;
         cv::Mat kk;
         cv::cvtColor(img, kk, CV_BGR2YUV);
         cv::split(kk, out);
 
         // 彩色直方图均衡过程
         cv::Mat colorimt;
         cv::Ptr<cv::CLAHE> clahe =cv::createCLAHE();
         clahe->setClipLimit(3);
         clahe->setTilesGridSize(cv::Size(8,8));
         // 对YUV中亮度通道进行直方图均衡
         kk = out[0];
         // colorimt为CLAHE处理后的亮度通道
         clahe->apply(kk, colorimt);
         out.at(0) = colorimt;
         cv::Mat cc;
         cv::merge(out, cc); // 将Y,U,V三个通道合并
         // cv::imshow("YUV",cc);  //YUV图
         // 需要把YUV格式转化回RGB格式
         cv::cvtColor(cc, colorimt, CV_YUV2BGR);
         IplImage tmp = colorimt;
         *dst = tmp;
         return 0;
}


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

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

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


 

其中API定义如下:

public class API
{
[DllImport("dll名称",EntryPoint = "histo_enhance", CallingConvention =CallingConvention.Cdecl)]
public static extern inthisto_enhance(IntPtr src,IntPtr dst);
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Opencv传递Mat类参数给Emgucv的Image类

这篇文章来说说怎么将Opencv的Mat通过dll链接库传递参数给Emgucv的Image类使用。 这里还是借助两个中间量来实现这个工程,即Opencv中的 IplImage类和Emgucv里的MIp...
  • lsq2902101015
  • lsq2902101015
  • 2015年07月23日 15:07
  • 3021

OpenCV中的结构体、类与EmguCV的对应表

Basic Structures main data structures used in opencv.Dynamic Structuresfor creating growable sequenc...
  • utimes
  • utimes
  • 2013年01月02日 22:29
  • 10496

opencv与emgucv的参数传递

因为需要使用c#调用c++编写的dll,且dll中涉及OpenCV函数调用,因此参数的传递可以采用emgucv提供的接口,而不用傻乎乎的将c#中的结构转为字节,再在c++中重新转为opencv的结构。...
  • lingtianyulong
  • lingtianyulong
  • 2017年04月08日 22:07
  • 661

Emgucv传递Image类参数给Opencv的Mat类

最近在使用C++的DLL链接库开发C#Emgucv程序,其中要将Emgucv中的Image类传递给Opencv中的Mat类,通过下面的方法进行了实现。 首先,将Emgucv中的Image对象转换成...
  • lsq2902101015
  • lsq2902101015
  • 2015年07月09日 12:32
  • 2719

Emgu CV 第一个实例

Emgu CV下载地址 http://sourceforge.net/projects/emgucv/files/ 找最新的下就行了,傻瓜式安装,选择目录后自动完成安装,然后提示安装VS2008和...
  • fioletfly
  • fioletfly
  • 2012年03月07日 15:23
  • 30260

EmguCV Image类中的函数(二)使用MorphologyEx进行更多的变换

MorphologyEx中所有的变换如下图所示 调用方法: Mat aaa = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShap...
  • qq_22033759
  • qq_22033759
  • 2015年08月21日 14:35
  • 5214

OpenCV与EmguCV中的图像轮廓提取

轮廓是图像中表示边界的一系列点的集合。虽然边缘检测算法可以根据像素间的差异检查出轮廓边界的像素,但是它并没有把轮廓做为一个整体表示出来。所以下一步工作是把这些边缘检测出来的像素组装成轮廓。openCV...
  • u013162930
  • u013162930
  • 2016年07月18日 14:08
  • 9274

opencv与emgucv的参数传递

inthisto_enhance(IplImage* src, IplImage* dst) { cv::Mat img = cv::cvarrToMat(src...
  • chaojichaoachao
  • chaojichaoachao
  • 2015年11月20日 16:18
  • 1458

C#调用 opencv cv::Mat 图像, 采用折中方法

手把手教你如何让C#调用opencv里面的 cv::Mat or IplImage* C# 用于界面的制作要比MFC高效许多,但是有时候为了效率需要用C++程序,这样就涉及到了把C++核心算...
  • yeyang911
  • yeyang911
  • 2016年04月15日 08:56
  • 7418

C#下的OpenCv----EmguCV入门

介绍了C#下使用OpenCV的一些基础,属于入门级资料。
  • lbd2008
  • lbd2008
  • 2011年04月13日 18:39
  • 10529
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:opencv与emgucv的参数传递
举报原因:
原因补充:

(最多只允许输入30个字)