如何在EMGUCV 3.1上拍摄相机的屏幕截图?

时间:2017-04-07 23:12:12

标签: c# opencv computer-vision screenshot emgucv

我在EMGU CV上做了一个非常简单的程序,所以我需要截取我的相机正在录制的内容并将其保存在特定的文件夹中,按照我的相机捕获代码进行操作:

ng-switch
  

我为简单的术语道歉,我在编程方面仍然很棒。

2 个答案:

答案 0 :(得分:1)

好像你刚刚发布了EmguCV wiki的标准代码。但是,让我尝试解释如何在计算机上显示网络摄像头的视频,并在按下按钮时保存屏幕截图(您必须自己创建所有UI元素)。您需要一个带有PictureBox元素的表单来显示图像,还需要一个用于保存快照的按钮。

我将通过评论解释代码中的所有内容,并使用标准的EmguCV代码进行操作:

private Capture capture;
private bool takeSnapshot = false;

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    // Make sure we only initialize webcam capture if the capture element is still null
    if (capture == null)
    {
        try
        {
            // Start grabbing data, change the number if you want to use another camera
            capture = new Capture(0);
        }
        catch (NullReferenceException excpt)
        {
            // No camera has been found
            MessageBox.Show(excpt.Message);
        }
    }

    // This makes sure the image will be fitted into your picturebox
    originalImageContainer.SizeMode = PictureBoxSizeMode.StretchImage;

    // When the capture is initialized, start processing the images in the PorcessFrame method
    if (capture != null)
        Application.Idle += ProcessFrame;
}

// You registered this method, so whenever the application is Idle, this method will be called.
// This allows you to process a new frame during that time.
private void ProcessFrame(object sender, EventArgs arg)
{
    // Get the newest webcam frame
    Image<Bgr, double> capturedImage = capture.QueryFrame();
    // Show it in your PictureBox. If you don't want to convert to Bitmap you should use an ImageBox (which is an EmguCV element)
    originalImageContainer.Image = capturedImage.ToBitmap();

    // If the button was clicked indicating you want a snapshot, save the image
    if(takeSnapshot)
    {
        // Save the image
        capturedImage.Save(@"C:\your\picture\path\image.jpg");
        // Set the bool to false again to make sure we only take one snapshot
        takeSnapshot = !takeSnapshot;
    }
}

//When clicking the save button
private void SaveButton_Click(object sender, EventArgs e)
{
    // Set the bool to true, so that on the next frame processing the frame will be saved
    takeSnapshot = !takeSnapshot;
}

希望这会对你有所帮助。如果还有什么不清楚,请告诉我!

答案 1 :(得分:0)

有时 Bgr 无法直接转换为位图。相反,我确实雇用 以下几行:

 Emgu.CV.Mat capturedImage = capture.QueryFrame();
 pictureBox1.Image = capturedImage.Bitmap;