当我们在进行图像处理时,有时候需要在图像上的某个重要点、形状、轮廓进行标注,这时候就可以使用Emgu CV的DrawMarker()函数了。
官方定义如下:
public static void DrawMarker(
IInputOutputArray img, // 输入的图像
Point position, //标记符的坐标
MCvScalar color, // 标记符的颜色,BGR颜色格式
MarkerTypes markerType, //标记符的种类
int markerSize = 20, // 标记符尺寸,默认20
int thickness = 1, // 标记符线条宽度,默认1,值越标记符越粗
LineType lineType = LineType.EightConnected // 线型(4邻域或8邻域,默认8邻域)
)
标记符共有以下几种:
public enum MarkerTypes
{
//
// A crosshair marker shape,十字线(横竖两根线)
Cross,
//
// A 45 degree tilted crosshair marker shape,交叉线(45斜着两根线)
TiltedCross,
//
// A star marker shape, combination of cross and tilted cross,米字线(横竖加斜着共四根线)
Star,
//
// A diamond marker shape,钻石型,就是旋转45度的正方形
Diamond,
//
// A square marker shape,正方形
Square,
//
// An upwards pointing triangle marker shape,尖角向上的三角形
TriangleUp,
//
// A downwards pointing triangle marker shape,尖角向下的三角形
TriangleDown
}
下面开始画图,在lena.jpg中画三行标记符,每一行显示7中不同的符号,并用不同的颜色显示每一行标记符,第一行标记符1个像素宽度,第二行标记符2个像素宽度,第三行标记符5个像素宽度。效果如下:
代码如下:
Mat m = srcMat.Clone();
CvInvoke.DrawMarker(m, new System.Drawing.Point(40, 100), new MCvScalar(255, 0, 0), MarkerTypes.Cross, 20, 1, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(110, 100), new MCvScalar(255, 0, 0), MarkerTypes.TiltedCross, 20, 1, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(180, 100), new MCvScalar(255, 0, 0), MarkerTypes.Star, 20, 1, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(250, 100), new MCvScalar(255, 0, 0), MarkerTypes.Diamond, 20, 1, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(320, 100), new MCvScalar(255, 0, 0), MarkerTypes.Square, 20, 1, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(390, 100), new MCvScalar(255, 0, 0), MarkerTypes.TriangleUp, 20, 1, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(460, 100), new MCvScalar(255, 0, 0), MarkerTypes.TriangleDown, 20, 1, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(40, 250), new MCvScalar(0, 255, 0), MarkerTypes.Cross, 40, 2, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(110, 250), new MCvScalar(0, 255, 0), MarkerTypes.TiltedCross, 40, 2, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(180, 250), new MCvScalar(0, 255, 0), MarkerTypes.Star, 40, 2, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(250, 250), new MCvScalar(0, 255, 0), MarkerTypes.Diamond, 40, 2, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(320, 250), new MCvScalar(0, 255, 0), MarkerTypes.Square, 40, 2, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(390, 250), new MCvScalar(0, 255, 0), MarkerTypes.TriangleUp, 40, 2, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(460, 250), new MCvScalar(0, 255, 0), MarkerTypes.TriangleDown, 40, 2, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(40, 400), new MCvScalar(0, 0, 255), MarkerTypes.Cross, 60, 5, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(110, 400), new MCvScalar(0, 0, 255), MarkerTypes.TiltedCross, 60, 5, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(180, 400), new MCvScalar(0, 0, 255), MarkerTypes.Star, 60, 5, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(250, 400), new MCvScalar(0, 0, 255), MarkerTypes.Diamond, 60, 5, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(320, 400), new MCvScalar(0, 0, 255), MarkerTypes.Square, 60, 5, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(390, 400), new MCvScalar(0, 0, 255), MarkerTypes.TriangleUp, 60, 5, LineType.FourConnected);
CvInvoke.DrawMarker(m, new System.Drawing.Point(460, 400), new MCvScalar(0, 0, 255), MarkerTypes.TriangleDown, 60, 5, LineType.FourConnected);
原创不易,请勿抄袭。共同进步,相互学习。