无法从 '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<Bgr, byte> grayImage = new Image<Bgr, byte>(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[*,*,*]'的主要内容,如果未能解决你的问题,请参考以下文章
DateTimeParseException:无法解析文本:无法从 TemporalAccessor 获取 LocalDateTime