Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
网络摄像头、C#和可靠的包装器_C#_.net_Dll_Webcam - Fatal编程技术网

网络摄像头、C#和可靠的包装器

网络摄像头、C#和可靠的包装器,c#,.net,dll,webcam,C#,.net,Dll,Webcam,我迫切需要一个包装器的替代品,该包装器正在C#应用程序中使用。基本上,我们需要做的是在两个图片框中的一个上附加一个网络摄像头提要。这将用于在按下按钮时拍摄静止图像,该按钮可分离相机馈送并将静止图像连接到该图片框,然后重新连接相机馈送。我们以前发现了一些免费代码,可以与CaptureDevice.cs文件和Pinvoke.dll一起使用,将其绑定到avicap32.dll中。不幸的是,这似乎有随机的、间歇性的错误,无法可靠地再现。它太薄了。在一些随机点,其中一个图片框可能会变黑,并且在拍摄图片之前

我迫切需要一个包装器的替代品,该包装器正在C#应用程序中使用。基本上,我们需要做的是在两个图片框中的一个上附加一个网络摄像头提要。这将用于在按下按钮时拍摄静止图像,该按钮可分离相机馈送并将静止图像连接到该图片框,然后重新连接相机馈送。我们以前发现了一些免费代码,可以与CaptureDevice.cs文件和Pinvoke.dll一起使用,将其绑定到avicap32.dll中。不幸的是,这似乎有随机的、间歇性的错误,无法可靠地再现。它太薄了。在一些随机点,其中一个图片框可能会变黑,并且在拍摄图片之前不会显示提要,此时正确的图片会附加到图片框。然后,即使只连接了一个摄像头,它也会不断提示选择摄像头,否则它不会这样做

坦率地说,我感到惊讶和沮丧的是,微软没有在.NET中包含任何内容来涵盖网络摄像头视频源。我正在寻找一种可靠且相对简单的方法来取代这个有缺陷的网络摄像头系统。

我可以提出建议吗

我在很多C++库中使用OpenCV,它看起来很适合我尝试过的其他网络摄像头。Emgu只是OpenCV的C#包装器

下面是一个示例项目,可以在其上进行尝试。这是非常基本和简单的,但应该立即工作

(刚刚上传)

样本:

using Emgu.CV;
using Emgu.CV.Structure;
...

public partial class Form1 : Form
{
    public Capture cvWebCam;
    public Form1()
    {
        InitializeComponent();

        try
        {
            cvWebCam = new Capture();
            timer1.Start();
        }
        catch
        {
            Console.WriteLine("Default camera not found or could not start");
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (cvWebCam != null)
        using (Emgu.CV.Image<Bgr, byte> frame = cvWebCam.QueryFrame())
        {
            pictureBox1.BackgroundImage = frame.ToBitmap();
        }
    }
}
使用Emgu.CV;
使用Emgu.CV.Structure;
...
公共部分类Form1:Form
{
公共网络摄像头;
公共表格1()
{
初始化组件();
尝试
{
cvWebCam=新捕获();
timer1.Start();
}
抓住
{
Console.WriteLine(“未找到默认摄像机或无法启动”);
}
}
私有无效计时器1_刻度(对象发送方,事件参数e)
{
如果(cvWebCam!=null)
使用(Emgu.CV.Image frame=cvWebCam.QueryFrame())
{
pictureBox1.BackgroundImage=frame.ToBitmap();
}
}
}

试试DirectShow.net-这是一个免费的包装库,可以从.net访问DirectShow功能:

其代码示例还包含一个用于从网络摄像头捕获视频的示例应用程序:

现在是使用
MediaCapture
对象的时候了。将此示例用于MS Windows 10


同时阅读本文

商业图书馆是一种选择吗?本文中的一些链接可能会有所帮助:这里还有一些示例代码:与XNA相关,但可能适合您。它基本上只是接入DirectShow(DirectX的一部分)。对不起,Yahia,但广告已经出炉了。这个应用程序很可能是免费的,开源的。@user1017413检查我的答案,我添加了一个源项目,相机工作正常。