无法从 'System.Drawing.Bitmap' 转换为 'byte[*,*,*]'

Posted

技术标签:

【中文标题】无法从 \'System.Drawing.Bitmap\' 转换为 \'byte[*,*,*]\'【英文标题】: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。 非常感谢我得到了答案。 【参考方案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);

【讨论】:

以上是关于无法从 'System.Drawing.Bitmap' 转换为 'byte[*,*,*]'的主要内容,如果未能解决你的问题,请参考以下文章

无法从资源加载位图

为啥我无法从 Alamofire 获取请求结果

DateTimeParseException:无法解析文本:无法从 TemporalAccessor 获取 LocalDateTime

无法从 'char[]' 转换为 'string[]' [关闭]

无法远程调试应用程序 - 端口无法从外部访问

无法从状态 '' 解析 '...'