>

웹캠에서 원을 감지하기 위해 emguCV를 사용하려고합니다. 나는 그것에 대한 경험이 없으며 이것은 처음입니다. 이 튜토리얼 https://www.youtube.com/watch?v=vdjoutNR2DQ를 따르려고합니다. 그러나 다른 버전을 사용하고있는 것 같습니다

-라인 168 오류 : Emgu.CV.Mat '유형을'Emgu.CV.Image '로 암시 적으로 변환 할 수 없습니다

-171 행에서 오류 'Emgu.CV.Image'유형을 'Emgu.CV.Image'로 암시 적으로 변환 할 수 없습니다

-In line 173 Error : 'Emgu.CV.Image.HoughCircles (Emgu.CV.Structure.Bgr, Emgu.CV.Structure.Bgr, double, double, int, int)'에 대한 가장 오버로드 된 메소드 일치 잘못된 인수들

-같은 줄에 173 오류 : Argument 1&2 : 'Emgu.CV.Structure.Gray'에서 'Emgu.CV.Structure.Bgr로 변환 할 수 없습니다

이것들은 emguCV에서 사용하고있는 참고 문헌입니다

이것은 코드입니다

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.
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.UI;
namespace videosearch
{
public partial class detect : Form
{
    Capture cp = null;
    bool blac = false;
    Image<Bgr, byte> imageorgnal;
    Image<Bgr, byte> imgproc;
    public detect()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        if (blac == true)
        {
            Application.Idle -= procframdatGUI;
            blac = false;
            button1.Text = "Resume";
        }
        else
        {
            Application.Idle += procframdatGUI;
            button1.Text = "pause";
            blac = true;
        }
    }
    private void detect_Load(object sender, EventArgs e)
    {
        try
        {
            cp = new Capture(Emgu.CV.CvEnum.CaptureType.DShow);
        }
        catch (NullReferenceException ex)
        {
            MessageBox.Show(ex.Message);
            return;
        }
        Application.Idle += procframdatGUI;
        blac = true;
    }
    private void detect_Close(object sender, FormClosedEventArgs e)
    {
        if (cp!=null)
        {
            cp.Dispose();
        }
    }
    void procframdatGUI(object sender, EventArgs e)
    {
        imageorgnal = cp.QueryFrame();//line 168 Error: Cannot implicitly convert type Emgu.CV.Mat'to 'Emgu.CV.Image<Emgu.CV.Structure.Bgr,byte>'   
        if (imageorgnal == null)
            return;
        imgproc = imageorgnal.InRange(new Bgr(0, 0, 175), new Bgr(100, 100, 256));// line 171    Error  Cannot implicitly convert type 'Emgu.CV.Image<Emgu.CV.Structure.Gray,byte>' to 'Emgu.CV.Image<Emgu.CV.Structure.Bgr,byte>'
        imgproc = imgproc.SmoothGaussian(9);
        CircleF[] cir = imgproc.HoughCircles(new Gray(100), new Gray(50), 2, imgproc.Height / 4, 10, 400); //In line 173 Error: The best overloaded method match for 'Emgu.CV.Image<Emgu.CV.Structure.Bgr,byte>.HoughCircles(Emgu.CV.Structure.Bgr, Emgu.CV.Structure.Bgr,double, double, int, int)' has some invalid arguments
// in same line Error   :Argument 1 &2: cannot convert from 'Emgu.CV.Structure.Gray' to 'Emgu.CV.Structure.Bgr'
        foreach (CircleF ci in cir)
        {
            if (textBox1.Text!="")
            {
                textBox1.AppendText(Environment.NewLine);
            }
            textBox1.AppendText("ball position x=" + ci.Center.X.ToString().PadLeft(4) + "\n Y= " + ci.Center.Y.ToString().PadLeft(4)+ "\n ridius"+ci.Radius.ToString("###.000").PadLeft(7));
            textBox1.ScrollToCaret();
            CvInvoke.Circle(imgproc, new Point((int)ci.Center.X, (int)ci.Center.Y), 3, new MCvScalar(0, 255, 0), -1, 0, 0);
            imageorgnal.Draw(ci, new Bgr(Color.Red), 3);

        }
        imageBox1.Image = imageorgnal;
        imageBox2.Image = imgproc;
    }
}
}


  • 답변 # 1

    문제를 해결했다고 생각합니다

    168 행의 문제 오류 : Emgu.CV.Mat '유형을'Emgu.CV.Image '로 암시 적으로 변환 할 수 없습니다.
    내가 한 것은 캡처를 사용하는 대신 파일에서 이미지를 가져 오는 것입니다

      public string [] imagepath; 
       OpenFileDialog op = new OpenFileDialog();
            op.Multiselect = true;
            if (op.ShowDialog() != DialogResult.Cancel)
            {
                imagepath = new string[op.SafeFileNames.Length];
                imagepath = op.
            }
    
    
    171 행의 문제에 대한 오류 오류 'Emgu.CV.Image'유형을 'Emgu.CV.Image'로 암시 적으로 변환 할 수 없습니다. 이미지의 초기화를 변경합니다

    Image<Bgr, byte> imageorgnal;
    Image<Gray, byte> imgproc;;
    
    

    173 행의 문제를 해결함으로써 오류 : Argument 1&2 : 'Emgu.CV.Structure.Gray'에서 'Emgu.CV.Structure.Bgr'로 변환 할 수 없습니다 그런 다음 173 줄의 문제를 해결하기 위해 [0]을 추가합니다.

    CircleF[] cir = imgproc.HoughCircles(new Gray(100), new Gray(50),5, imgproc.Height / 4, 10, 500)[0];
    
    

    따라서 변경 한 후이 코드를 변경 한 후

    using System;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using Emgu.CV;
    using Emgu.CV.CvEnum;
    using Emgu.CV.Structure;
    using Emgu.CV.UI;
    using Emgu.Util;
    namespace videosearch
    {
    public partial class detect : Form
    {
        int i = 0;
        bool blac = false;
        Image<Bgr, byte> imageorgnal;
        Image<Gray, byte> imgproc;
        string[] imagepath;
        public detect()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            // to run all the image 
            if (blac == true)
            {
                Application.Idle -= procframdatGUI;
                blac = false;
                button1.Text = "Resume";
            }
            else
            {
                Application.Idle += procframdatGUI;
                button1.Text = "pause";
                blac = true;
            }
        }
        void procframdatGUI(object sender, EventArgs e)
        {
            if (imagepath != null)
            {
                Bitmap p = new Bitmap(imagepath[i]);
                p = comparePic.ResizeBitmap(p, 680, 480);
                imageorgnal = new Image<Bgr, byte>(p);
                i++; //incrce i for next iamge 
                if (i >= imagepath.Length)
                    i = 0;
                if (imageorgnal == null)
                    return;
                imgproc = imageorgnal.InRange(new Bgr(0, 0, 175), new Bgr(100, 100, 256));
                imgproc = imgproc.SmoothGaussian(9);
                CircleF[] cir = imgproc.HoughCircles(new Gray(100), new Gray(50), 5, imgproc.Height / 4, 10, 500)[0];
                foreach (CircleF ci in cir)
                {
                    if (textBox1.Text != "")
                    textBox1.AppendText(Environment.NewLine);
                    textBox1.AppendText("ball position x=" + ci.Center.X.ToString().PadLeft(4) + "\n Y= " + ci.Center.Y.ToString().PadLeft(4) + "\n ridius" + ci.Radius.ToString("###.000").PadLeft(7));
                    textBox1.ScrollToCaret();
                    CvInvoke.Circle(imgproc, new Point((int)ci.Center.X, (int)ci.Center.Y), 3, new MCvScalar(0, 255, 0), -1, LineType.AntiAlias, 0);
                    imageorgnal.Draw(ci, new Bgr(Color.Red), 4);
                }
                imageBox1.Image = imageorgnal;
                imageBox2.Image = imgproc;
            }
            else
                MessageBox.Show("iamges haven't been selected");
        }
        private void button2_Click(object sender, EventArgs e)
        {
            //next image 
            procframdatGUI(null, null);
            blac = true;
        }
        private void button3_Click(object sender, EventArgs e)
        {
            //select images 
            OpenFileDialog op = new OpenFileDialog();
            op.Multiselect = true;
            if (op.ShowDialog() != DialogResult.Cancel)
            {
                imagepath = new string[op.SafeFileNames.Length];
                imagepath = op.FileNames;
            }
        }
    }
    }
    
    

관련 자료

  • 이전 compilation - FFMPEG를 컴파일하는 동안 정적 x265를 찾을 수 없음
  • 다음 entity framework - C #에서"활성화 된 이벤트 시간 스레드 예외"를 수정하는 방법?