EmguCV 中的 drawMarker 相当于什么?

What is the equivalent of drawMarker in EmguCV?

在 OpenCV 中,有 drawMarker 函数可以在图像中的给定位置绘制标记。

我在 EmguCV 找不到这个函数,那么在 EmguCV 中有什么相当于 drawMarker 的?我需要标记Mat.

似乎这个函数 drawMarker 并没有明确存在于 EmguCV 代码中,尽管它存在于 OpenCV Code,第 1732 到 1795 行中,所以我认为你唯一的解决方案是添加它作为代码中的函数。

/// <summary>
/// Draws a marker on a given position in the image.
/// </summary>
/// <param name="img">The image.</param>
/// <param name="position">The point where the crosshair is positioned.</param>
/// <param name="color">Line color.</param>
/// <param name="markerType">The specific type of marker you want to use: 0 - Crosshair marker. 1 - 45 degree tilted crosshair marker. 2 - Star marker. 3 - Diamond marker. 4 - Upwards pointing triangle marker. 5 - Downwards pointing triangle marker.</param>
/// <param name="markerSize">The length of the marker axis [default = 20 pixels].</param>
/// <param name="thickness">Line thickness.</param>
/// <param name="line_type">Type of the line: -1 - Filled. 4 - 4-connected line. 8 - 8-connected line. 16 - Anti-aliased line.</param>
private void DrawMarker(IInputOutputArray img, Point position, MCvScalar color, MarkerType markerType, int markerSize, int thickness, LineType line_type)
{
    switch (markerType)
    {
        // The cross marker case
        case MarkerType.MarkerCross:
            CvInvoke.Line(img, new Point(position.X - markerSize / 2, position.Y), new Point(position.X + markerSize / 2, position.Y), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X, position.Y - markerSize / 2), new Point(position.X, position.Y + markerSize / 2), color, thickness, line_type);
            break;
        // The tilted cross marker case
        case MarkerType.MarkerTiltedCross:
            CvInvoke.Line(img, new Point(position.X - markerSize / 2, position.Y - markerSize / 2), new Point(position.X + markerSize / 2, position.Y + markerSize / 2), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X + markerSize / 2, position.Y - markerSize / 2), new Point(position.X - markerSize / 2, position.Y + markerSize / 2), color, thickness, line_type);
            break;
        // The star marker case
        case MarkerType.MarkerStar:
            CvInvoke.Line(img, new Point(position.X - markerSize / 2, position.Y), new Point(position.X + markerSize / 2, position.Y), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X, position.Y - markerSize / 2), new Point(position.X, position.Y + markerSize / 2), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X - markerSize / 2, position.Y - markerSize / 2), new Point(position.X + markerSize / 2, position.Y + markerSize / 2), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X + markerSize / 2, position.Y - markerSize / 2), new Point(position.X - markerSize / 2, position.Y + markerSize / 2), color, thickness, line_type);
            break;
        // The diamond marker case
        case MarkerType.MarkerDiamond:
            CvInvoke.Line(img, new Point(position.X, position.Y - markerSize / 2), new Point(position.X + markerSize / 2, position.Y), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X + markerSize / 2, position.Y), new Point(position.X, position.Y + markerSize / 2), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X, position.Y + markerSize / 2), new Point(position.X - markerSize / 2, position.Y), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X - markerSize / 2, position.Y), new Point(position.X, position.Y - markerSize / 2), color, thickness, line_type);
            break;
        // The square marker case
        case MarkerType.MarkerSquare:
            CvInvoke.Line(img, new Point(position.X - markerSize / 2, position.Y - markerSize / 2), new Point(position.X + markerSize / 2, position.Y - markerSize / 2), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X + markerSize / 2, position.Y - markerSize / 2), new Point(position.X + markerSize / 2, position.Y + markerSize / 2), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X + markerSize / 2, position.Y + markerSize / 2), new Point(position.X - markerSize / 2, position.Y + markerSize / 2), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X - markerSize / 2, position.Y + markerSize / 2), new Point(position.X - markerSize / 2, position.Y - markerSize / 2), color, thickness, line_type);
            break;
        // The triangle up marker case
        case MarkerType.MarkerTriangleUp:
            CvInvoke.Line(img, new Point(position.X - markerSize / 2, position.Y + markerSize / 2), new Point(position.X + markerSize / 2, position.Y + markerSize / 2), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X + markerSize / 2, position.Y + markerSize / 2), new Point(position.X, position.Y - markerSize / 2), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X, position.Y - markerSize / 2), new Point(position.X - markerSize / 2, position.Y + markerSize / 2), color, thickness, line_type);
            break;
        // The triangle down marker case
        case MarkerType.MarkerTriangleDown:
            CvInvoke.Line(img, new Point(position.X - markerSize / 2, position.Y - markerSize / 2), new Point(position.X + markerSize / 2, position.Y - markerSize / 2), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X + markerSize / 2, position.Y - markerSize / 2), new Point(position.X, position.Y + markerSize / 2), color, thickness, line_type);
            CvInvoke.Line(img, new Point(position.X, position.Y + markerSize / 2), new Point(position.X - markerSize / 2, position.Y - markerSize / 2), color, thickness, line_type);
            break;
        // If any number that doesn't exist is entered as marker type, draw a cross marker, to avoid crashes
        default:
            DrawMarker(img, position, color, MarkerType.MarkerCross, markerSize, thickness, line_type);
            break;
    }
}

您还需要为 markerType 添加一个 enum 就像 OpenCV 的 imgproc.hpp 第 825 至 837 行。

/// <summary>
/// Possible set of marker types used for the DrawMarker function
/// </summary>
enum MarkerType
{
    /// <summary>
    /// A crosshair marker shape
    /// </summary>
    MarkerCross = 0,
    /// <summary>
    /// A 45 degree tilted crosshair marker shape
    /// </summary>
    MarkerTiltedCross = 1,
    /// <summary>
    /// A star marker shape, combination of cross and tilted cross
    /// </summary>
    MarkerStar = 2,
    /// <summary>
    /// A diamond marker shape
    /// </summary>
    MarkerDiamond = 3,
    /// <summary>
    /// A square marker shape
    /// </summary>
    MarkerSquare = 4,
    /// <summary>
    /// An upwards pointing triangle marker shape
    /// </summary>
    MarkerTriangleUp = 5,
    /// <summary>
    /// A downwards pointing triangle marker shape
    /// </summary>
    MarkerTriangleDown = 6
}

它被添加到 CvInvoke class 作为 DrawMarker 函数,在这个 Git 提交中找到:

https://github.com/emgucv/emgucv/commit/6a82dd6b6093934661a3b49155c9078016baef5f

它将包含在下一个 EmguCV 版本中。