最近要做一个程序,程序主体用C#写的,要使用摄像头。
最先考虑的是用C++调用openCV写成dll,给C#调用。后来感觉有点复杂就转而使用EmguCV了。
但是使用中发现两个bug,其一是无法得到摄像头的名字(这个可以通过C#本身枚举系统设备实现,但是这之后还是遇到一个bug,摄像头名字跟编号不对应,有两个摄像头的话,用VidioCapture打开后是另外一个),其二是通过使用SetCaptureProperty方法修改摄像头参数时无效,网上搜了半天竟然没有人遇到类似问题,也无无从解决,真是莫名其妙。
又考虑到后续还有很多图像处理工作要用OpenCV,在C#里通过EmguCV调用效率恐怕也难以保证。
于是下定决心,回过头来再研究一下C++与C#混合编程的方法。
基本思路是,在C++中调用openCV读取摄像头的数据,传回给C#显示在PictureBox中。具体实现方法是通过将C#中的IntrPtr类型传入C++的函数,在其中赋值。
测试如下,在C++中
extern "C" __declspec(dllexport) void Test2(unsigned char* x) {
for (int i = 0; i < 10; i++)
x[i] = i;
}
在C#中,声明外部函数
[DllImport("C:\\Users\\boron\\source\\repos\\CVUtilityDll\\debug\\CVUtilityDll.dll"