C#中的网络摄像头使用

我正在使用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,但他们确实没有给我们任何具有所有function的替代品,而且我发现它在所有现有平台上都能正常运行(它已经非常根深蒂固,所以我无法想象支持会消失任何时候很快)。

SourceForge上有一个非常好的DirectShow库 。 与它唯一的“问题”是它真的很复杂,这源于DShow首先是如此复杂和令人困惑的事实。 包装器可以做很多事情并不容易解决,但它们确实提供了许多常见用例的示例,如显示video或捕获帧。 如果你想添加叠加层,或插入其他filter,它可以做到,但要预先警告它根本不是直截了当的。

看一下这篇文章: http : //www.codeproject.com/KB/miscctrl/webcam_c_sharp.aspx

这比安装和使用OpenCVNetWrapper简单得多。

你试过Clipboard.GetImage()吗? 您还可以尝试各种Clipboard.Contains *()方法,以查看数据存储在剪贴板中的格式。

OpenCV捕获,EMGU捕获和我尝试过的所有其他捕获库
都有同样的问题:你不能以编程方式高于640×480
(无需打开Windowsvideo源窗口)。

我建议使用它(这确实有效):
https://github.com/ofTheo/videoInput

这也是如何在C#中获取网络摄像头的? 你可能会发现以下有用(抱歉发送垃圾邮件,但这确实有助于回答这个问题):

我刚刚发布了我的Windows应用程序CamTimer的完整源代码(用.NET / C#编写)。 通过https://github.com/johanssonrobotics/CamTimer下载/查看完整代码(带有工作网络摄像头示例)

快乐的编码!