Ошибка захвата EmguCV: невозможно неявно преобразовать тип Emgu.CV.Mat в Emgu.CV.Image ‹Emgu.CV.Structure.Bgr, byte›

Я использую EmguCV с C #, я столкнулся с проблемой, когда хочу захватить кадры с моей веб-камеры, в операторе появляется красное подчеркивание:

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;
        }
    }
}

person Nouman Ahmed    schedule 04.07.2015    source источник
comment
Какой тип imgOrg? Какой тип возврата capturecam.QueryFrame()? Убедитесь, что оба типа одинаковы.   -  person ekad    schedule 05.07.2015
comment
да, того же типа, я просто копирую и вставляю свой предыдущий код, который работал правильно, я загружаю последнюю версию EmguCV cuda-3.0.0.2158 Image ‹Bgr, Byte› imgOrg; частная камера захвата захвата;   -  person Nouman Ahmed    schedule 06.07.2015
comment
Пожалуйста, отредактируйте свой вопрос и добавьте к нему код и любую другую дополнительную информацию, чтобы другие люди могли лучше понять ваш вопрос и, надеюсь, вы получите более точные ответы.   -  person ekad    schedule 06.07.2015
comment
тот же код, который я запускал правильно год назад. Одна новая вещь в этом проекте: я использую последнюю версию библиотеки Emgu CV   -  person Nouman Ahmed    schedule 06.07.2015


Ответы (6)


Это утверждение работает:

Image<Bgr, Byte> img = mat.ToImage<Bgr, Byte>();
person Byung K Choi    schedule 28.11.2015
comment
Это может ответить на вопрос, но я не понимаю, как это сделать. Нет переменной mat, и я не знаю, куда пойдет эта строка. Может быть, еще какие-то подробности и объяснение, почему решает проблему. - person blm; 28.11.2015

Попробуй это:

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

Посмотрите здесь: как преобразовать мат для изображения в (Emgu CV версии 3) в C #?

Или измените переменную Image на Mat:

Mat imgOrg = new Mat(); // instead of: Image<Bgr, Byte> imgOrg;
imgOrg = capture.QueryFrame();
imageBox1.Image = imgOrg;
person Hobbert Evergreen    schedule 22.09.2016

imgOrg = new Image(capturecam.QueryFrame().Bitmap);

Этот код работал у меня. Я надеюсь работать на вас тоже.

person Amin Shouraki    schedule 30.09.2015
comment
Было бы хорошо расширить этот ответ, объяснив, что делает код, который отличается, и как он устраняет проблему. Вы также можете поместить код в форматирование кода, чтобы ответ было легче читать. - person Klors; 30.09.2015
comment
Ну, тип imgOrg - это изображение, а вывод функции QueryFrame() - это матрица. поэтому я определил переменную с именем imgOrg и, как и при загрузке изображения, использовал new Image<Bgr, byte>, а вход был capturecam.QueryFrame().Bitmap, поэтому в одной строке я преобразовал выходную матрицу в растровое изображение. так работало нормально. - person Amin Shouraki; 30.09.2015

Это довольно просто. Это работает в 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;  
person BoiseBaked    schedule 18.07.2019
comment
это лучший ответ. он также работает с Core 3.1! - person Bellash; 16.06.2021

Изображение FRAME2 = frame.ToImage ();

person Patricio Mora    schedule 11.07.2015

Обратитесь к примеру, QueryFrame () больше не будет использоваться в EmguCV 3.0. его следует заменить на функцию 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;
person Ho-Chung Chung    schedule 23.07.2015
comment
QueryFrame - это на самом деле Grab (), за которым следует Retreive () - person Ivan; 02.09.2015