【问题标题】:cannot convert from 'System.Drawing.Bitmap' to 'byte[*,*,*]'无法从 'System.Drawing.Bitmap' 转换为 'byte[*,*,*]'
【发布时间】:2020-06-11 15:45:39
【问题描述】:
 Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
            Image<Bgr, byte> grayImage = new Image<Bgr, byte>(bitmap);
            Rectangle[] rectangles = cascadeclassifier.DetectMultiScale(grayImage, 1.2, 1);
            foreach(Rectangle rectangle in rectangles)
            {
                using (Graphics graphics = Graphics.FromImage(bitmap))
                {
                    using (Pen pen = new Pen(Color.OrangeRed,1))
                    {
                        graphics.DrawRectangle(pen, rectangle);
                    }
                }
            }

我在这里的代码有问题:

Image&lt;Bgr, byte&gt; grayImage = new Image&lt;Bgr, byte&gt;(bitmap);

错误在(位图)

错误是: Error CS1503 Argument 1: cannot convert from 'System.Drawing.Bitmap' to 'byte[*,*,*]'

【问题讨论】:

  • 您使用的是 Emgu.CV 4.1.0.3420 版吗?该代码适用于我使用该版本的 Emgu。
  • 非常感谢我得到了答案。

标签: c# window desktop face-recognition


【解决方案1】:

对于版本 4.3,使用:

var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
Image<Bgr, Byte> img1 = bmp.ToImage<Bgr, byte>();

【讨论】:

    【解决方案2】:

    您确定从 eventArgs 获得的帧实际上是位图吗?仅仅因为您将其转换为这样,它就不会转换为一个。

    尝试使用:

    eventArgs.Frame.Clone() as Bitmap
    

    并检查它是否为空。

    另外,请贴出抓帧方法供参考。

    【讨论】:

    • 我已经尝试过您的建议,但仍然无法正常工作。错误仍然相同。如何发布抓帧方法?
    【解决方案3】:

    降级到EmguCV 4.1.1.3497获取以下代码!

    【讨论】:

      【解决方案4】:

      我在使用最新的库 (4.4.0.4099) 后遇到了同样的问题。
      这是我为解决问题而不是降级所做的。

      // Create The Bitmap Object From EventArgs.
      using (Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone())
      {
          // Define A File Path.
          string filePath = Path.Combine(Path.GetTempPath(), DateTime.Now.ToString("ddmmyyyyhhmmssfff") + ".jpg");
      
          // Lock The Bits In Memory.
          BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
      
          // Create OpenCV Image<TColor,TDepth> Object And Add The bitmapData Properties Like So.
          using (Image<Bgr, byte> grayImage = new Image<Bgr, byte>(bitmap.Width, bitmap.Height, bitmapData.Stride, bitmapData.Scan0))
          {
              // Get The Rectangles That Should Be Detected From The Training Data.
              Rectangle[] rectangles = CascadeClassifier.DetectMultiScale(image: grayImage, scaleFactor: 1.2, minNeighbors: 1);
      
              // Unlock The Bits So We Can Draw To It.
              bitmap.UnlockBits(bitmapData);
      
              // Loop Each Rectange In The Retanges Collection.
              foreach (Rectangle rectangle in rectangles)
              {
                  // Create Graphics Object And Load The Bitmap From The Beginning
                  using (Graphics graphics = Graphics.FromImage(bitmap))
      
                  // Create A Pen, Choose Any Colour
                  using (Pen pen = new Pen(Brushes.Red))
                  {
                      // Draw The Rectange Onto The Bitmap.
                      graphics.DrawRectangle(pen, rectangle);
                  }
              }
      
              // Create A File Stream And Save The Modified Bitmap
              // We're Using The Above FilePath.
              using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite))
              {
                  bitmap.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
              }
          }
      
          // Open The Saved Image That Should Contain The Drawn Rectangle.
           System.Diagnostics.Process.Start(filePath);
      }
      

      【讨论】:

        猜你喜欢
        • 2022-01-16
        • 2016-01-29
        • 2021-08-26
        • 2013-02-10
        • 1970-01-01
        • 2018-09-05
        • 2019-11-21
        • 2015-08-16
        • 2020-12-05
        相关资源
        最近更新 更多