我正在使用C#编写一个程序来连接网络摄像头并使用它进行一些图像处理。 我有一个工作的应用程序,使用win32 api(avicap32.dll)连接到网络摄像头并向它发送消息,将其发送到剪贴板。问题是,虽然可以从paint中访问,但是从程序中读取它会产生空指针。

这是我用来连接网络摄像头的代码:

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 库.google.com / p / opencvdotnet /“rel =”noreferrer“> opencvdotnet 包装器。它支持从网络摄像头捕获帧:

using (var cv = new OpenCVDotNet.CVCapture(0))
{
    var image = cv.CreateCompatibleImage();
    // ...
    cv.Release();
}

如果您正在进行图像处理,OpenCV的图像处理算法已经包含在OpenCVDotNet.Algs程序集中。

如果你决定采用这条路线,请务必安装OpenCV 1.0版(并将其安装到“c:\ program files \ opencv”,如果你使用的是Vista 64位,或者“mklink OpenCV”c:\程序文件(x86)\ OpenCV`“来自正确的目录,否则opencvdotnet将无法安装。”

其他提示

有两种方法可以将相机数据导入您的应用程序,DirectShow和WIA。 Microsoft建议您使用 WIA ,WIA的界面非常简单包裹你的大脑。我根据工作创建并发布了一个开源 WIA桌面库我刚才做过。

现在WIA的问题在某些情况下太简单了。例如,如果要调整相机属性(如帧速率,分辨率等),则WIA会降低。微软不赞成使用DirectShow,但他们确实没有给我们任何具有所有功能的替代品,而且我发现它在所有现有平台上都能正常运行(它已经非常根深蒂固,所以我无法想象支持会消失任何时候很快)。

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

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

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

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

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

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

还在如何在C#中获取网络摄像头图片中询问了这一点?并且您可能会发现以下内容有用(抱歉发送垃圾邮件,但这确实有助于回答问题):

我刚刚发布了我的Windows应用程序CamTimer的完整源代码(用.NET / C#编写)。通过 https://github.com/johanssonrobotics/CamTimer

快乐的编码!

scroll top