我正在用C#编写一个程序来连接网络摄像头并用它做一些图像处理.我有一个工作的应用程序,使用win32 api(avicap32.dll)连接到网络摄像头并向它发送消息,将其发送到剪贴板.问题是,虽然可以从绘图中访问,但是从程序中读取它会导致空指针.
这是我用来连接网络摄像头的代码:
mCapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, 320, 240, 1024, 0); SendMessage(mCapHwnd, WM_CAP_CONNECT, 0, 0); SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, 0, 0);
这就是我用来将图像复制到剪贴板的方法:
SendMessage(mCapHwnd, WM_CAP_GET_FRAME, 0, 0); SendMessage(mCapHwnd, WM_CAP_COPY, 0, 0); tempObj = Clipboard.GetDataObject(); tempImg = (System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap);
有一些错误检查,我已从代码中删除,以使其更短.
提前致谢 :)
我最近开始在这个领域做一些爱好工作.
我们决定将OpenCV库与opencvdotnet包装器一起使用.它支持从网络摄像头捕获帧:
using (var cv = new OpenCVDotNet.CVCapture(0)) { var image = cv.CreateCompatibleImage(); // ... cv.Release(); }
如果您正在进行图像处理,OpenCV的图像处理算法已经包含在OpenCVDotNet.Algs程序集中.
如果您决定使用此路由,请确保安装OpenCV 1.0版(如果您使用的是Vista 64位,则将其安装到"c:\ program files\opencv",或者"mklink OpenCV"c:\ program files(x86)\OpenCV`"来自正确的目录,否则opencvdotnet将无法安装).
有两种方法可以将相机数据导入您的应用程序,DirectShow和WIA.Microsoft建议您使用WIA,WIA的界面非常简单,可以包含您的大脑.我根据我之前的工作创建并发布了一个开源的WIA桌面库.
现在WIA在某些情况下的问题是它太简单了.例如,如果要调整相机属性(如帧速率,分辨率等),则WIA会降低.微软不赞成使用DirectShow,但他们确实没有给我们任何具有所有功能的替代品,而且我发现它在所有现有平台上都能正常运行(它已经非常根深蒂固,所以我无法想象支持会消失任何时候很快).
SourceForge上有一个非常好的DirectShow库.与它唯一的"问题"是它真的很复杂,这源于DShow刚刚如此复杂和令人困惑的事实.包装器可以做很多事情并不容易解决,但它们确实提供了许多常见用例的示例,例如显示视频或捕获帧.如果你想添加叠加层,或者插入其他过滤器,它可以做到,但要预先警告它根本不是直截了当的.