【解決方法】「 」には「ビットマップ」の定義が含まれておらず、タイプ「 」の最初の引数を受け入れるアクセス可能な拡張メソッド「ビットマップ」が見つかりませんでした


i am getting Error CS1061  'Image<Bgr, byte>' does not contain a definition for 'Bitmap' and no accessible extension method 'Bitmap' accepting a first argument of type 'Image<Bgr, byte>' could be found (are you missing a using directive or an assembly reference?)

私が試したこと:

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.Structure;
using Emgu.CV.Util;



namespace objectdetection
{
  
    public partial class Form1 : Form
    {
        Image<Bgr, byte> imgInput;
        private Bitmap img;
        bool show = false;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                imgInput = new Image<Bgr, byte>(ofd.FileName);
                pictureBox1.Image = imgInput.Bitmap;  //<- here i am getting error
            }

        }

        private async void button2_Click(object sender, EventArgs e)
        {
            Image<Gray, byte> imgout = imgInput.Convert<Gray, byte>().Not().ThresholdBinary(new Gray(50), new Gray(255));
            VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
            Mat hier = new Mat();

            CvInvoke.FindContours(imgout, contours, hier, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);

            if (contours.Size > 0)
            {
                show = true;

                for (int i = 0; i < 10; i++)
                {
                    Rectangle rect = CvInvoke.BoundingRectangle(contours[i]);
                    imgInput.ROI = rect;
                    img = imgInput.Copy().Bitmap; //<- here i am getting error
                    this.Invalidate();
                    await Task.Delay(500);
                }
                show = false;
            }
            return;
            Dictionary<int, double> dict = new Dictionary<int, double>();

            if (contours.Size > 0)
            {
                for (int i = 0; i < contours.Size; i++)
                {
                    double area = CvInvoke.ContourArea(contours[i]);
                    Rectangle rect = CvInvoke.BoundingRectangle(contours[i]);

                    if (rect.Width > 50 && rect.Height > 30 && area < 3000)
                    {
                        dict.Add(i, area);
                    }
                }
            }



            var item = dict.OrderByDescending(v => v.Value);

            Image<Bgr, byte> imgout1 = new Image<Bgr, byte>(imgInput.Width, imgInput.Height, new Bgr(0, 0, 0));

            foreach (var it in item)
            {
                int key = int.Parse(it.Key.ToString());
                Rectangle rect = CvInvoke.BoundingRectangle(contours[key]);
                //CvInvoke.DrawContours(imgInput, contours, key, new MCvScalar(255, 255, 255),4);
                CvInvoke.Rectangle(imgout1, rect, new MCvScalar(255, 255, 255), 3);
            }

            pictureBox1.Image = imgout1.Bitmap;  //<- here i am getting error

        }
    }
}

解決策 1

あなたのコードを見てください:

C#
imgInput = new Image<Bgr, byte>(ofd.FileName);
pictureBox1.Image = imgInput.Bitmap;

imgInput は Image インスタンスであり、Bitmap は Image から派生した別のクラスです。つまり、Image クラスに派生クラスであるプロパティが含まれているわけではありません。

考えてみてください。リンゴは果物ですが、すべての果物がリンゴというわけではありません。オレンジはまったく別の果物であり、同じように扱うことはできません。
画像とビットマップは同じ関係を共有しています – すべての画像がビットマップではなく、すべてのビットマップが画像です!

また、PictureBox クラスのドキュメントを見ると、PicturBox.Image プロパティがとにかく Image を受け入れることがわかります。そのため、Image から派生したクラスはすべてそのまま入ります。コードを次のように変更します。

C#
imgInput = new Image<Bgr, byte>(ofd.FileName);
pictureBox1.Image = imgInput;

そして、それはコンパイルされます。

コーディング中に毎日、おそらく 1 日に何度も構文エラーが発生することを予期する必要があります。経験の豊富さに関係なく、誰もがそうです! 変数やキーワードのスペルを間違えることがあります。 文字列やコード ブロックを閉じるのを忘れることがあります。 猫があなたのキーボードの上を歩いて、とても奇妙なことをタイプすることがあります。 メソッド呼び出しに必要なパラメーターの数を忘れてしまうことがあります。

我々はすべての間違いを犯します。

そして、私たちは皆そうしているので、構文エラーを修正する必要があります。他の人が修正してくれるのを待つよりも、方法を学んで自分で修正する方がはるかに迅速です! したがって、エラー メッセージの読み方と、コンパイラが間違っていると言っていることに照らして記述されたコードを解釈する方法を学ぶことに少し時間を費やしてください。

だからこれを読んでください: 問題を解決するコードの書き方、初心者向けガイド パート 2: 構文エラー[^] – 次回コンパイル エラーが発生したときに役立つはずです。

コメント

タイトルとURLをコピーしました