1

我在 C# 中使用 EmguCV,当我想从我的网络摄像头抓取帧时遇到问题,声明中出现红色下划线:

imgOrg = capturecam.QueryFrame();

错误:无法将类型“Emgu.CV.Mat”隐式转换为“Emgu.CV.Image”

我怎么解决这个问题?

我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.UI;

namespace test2
{
    public partial class Form1 : Form
    {
        Image<Bgr, Byte> imgOrg; //image type RGB (or Bgr as we say in Open CV)
        private Capture capturecam;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                capturecam = new Capture();
            }
            catch (NullReferenceException exception)
            {
                MessageBox.Show(exception.Message);
                return;
            }
            Application.Idle += new EventHandler(ProcessFunction);

        }
        private void ProcessFunction(object sender, EventArgs arg)
        {
            imgOrg = capturecam.QueryFrame(); // error line
            imageBox1.Image = imgOrg;
        }
    }
}
4

6 回答 6

6

该声明有效:

Image<Bgr, Byte> img = mat.ToImage<Bgr, Byte>();
于 2015-11-28T06:49:54.820 回答
2

尝试这个:

imgOrg = capturecam.QueryFrame().ToImage<Bgr, Byte>();

看这里: 如何在 c# 中将 mat 转换为图像(Emgu CV 版本 3)?

或者将您的 Image 变量更改为 Mat:

Mat imgOrg = new Mat(); // instead of: Image<Bgr, Byte> imgOrg;
imgOrg = capture.QueryFrame();
imageBox1.Image = imgOrg;
于 2016-09-22T01:50:56.003 回答
1

这很简单。这适用于 Emgu CV 3.3++。

vidCap = new VideoCapture([filename or webcam device]);  
Mat mat = new Mat();  
vidCap.Read(mat);  //This calls Grab() as grabbing a frame and then Retrieve();  
imageBox1.Image = mat.Bitmap;  
于 2019-07-18T19:07:37.483 回答
1
imgOrg = new Image(capturecam.QueryFrame().Bitmap);

这段代码对我有用。我也希望为你工作。

于 2015-09-30T11:30:29.223 回答
0

Image FRAME2= frame.ToImage();

于 2015-07-11T15:23:15.430 回答
-1

参考示例,在 EmguCV 3.0 中不再使用 QueryFrame()。它被 Retrieve() 函数取代。

示例如下图:

        Mat frame = new Mat();
        cap.Retrieve(frame, 0);
        Mat grayFrame = new Mat();
        CvInvoke.CvtColor(frame, grayFrame, ColorConversion.Bgr2Gray);

        imageBox1.Image = frame;
        imageBox2.Image = grayFrame;
于 2015-07-23T07:37:24.600 回答