【问题标题】:Drawing rectangles using OpenCvSharp使用 OpenCvSharp 绘制矩形
【发布时间】:2021-08-08 17:10:25
【问题描述】:

我正在尝试在视频中实时绘制检测到的面孔,但我似乎无法让它工作

var haarcascade = new CascadeClassifier("C:/Users/NotMyName/Desktop/haar/haarcascade_frontalface_alt2.xml");
using (Window window = new Window("capture"))
using (Mat image = new Mat())//Image Buffer
{
    while (true)
    {
        Video.Read(image);
        var gray = image.CvtColor(ColorConversionCodes.RGB2GRAY);
        OpenCvSharp.Rect[] faces = haarcascade.DetectMultiScale(gray, 1.08, 2, HaarDetectionTypes.ScaleImage, new OpenCvSharp.Size(30,30));
        foreach (Rect i in faces)
        {
            Cv2.Rectangle(image, (faces[i].BottomRight.X, faces[i].BottomRight.Y), (faces[i].TopLeft.X, faces[i].TopLeft.Y), 255, 1);
        }

但是,编译器只会吐出错误。将 faces 数组直接传递给函数也不起作用。错误信息是(翻译自德语)。

错误 CS0029 类型“OpenCvSharp.Rect”无法转换为“int”

【问题讨论】:

  • 哪一行触发了这个错误?

标签: c# .net opencv facial-identification


【解决方案1】:

我认为正确的方法应该是这样的:

...
foreach (Rect i in faces)
{
    Cv2.Rectangle(image, new Point(i.BottomRight.X, i.BottomRight.Y), new Point(i.TopLeft.X, i.TopLeft.Y), 255, 1);
}
....

foreach 内的局部变量i 引用当前Rect

Cv2.Rectangle 方法接受OpenCvSharp.Point

【讨论】:

  • 就是这样,但是,正如您所指出的,它要求我将其指定为 OpenCvSharp.Point。谢谢你的帮助:)
【解决方案2】:

你可以直接使用Rect变量:

foreach (Rect r in faces)
    Cv2.Rectangle(image, (r.BottomRight.X, r.BottomRight.Y), (r.TopLeft.X, r.TopLeft.Y), 255, 1);

或使用int

foreach (int i = 0; i < faces.Length; i++)
    Cv2.Rectangle(image, (faces[i].BottomRight.X, faces[i].BottomRight.Y), (faces[i].TopLeft.X, faces[i].TopLeft.Y), 255, 1);

【讨论】:

    猜你喜欢
    • 2014-03-20
    • 2011-02-17
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-09
    • 1970-01-01
    相关资源
    最近更新 更多