opencvsharp 在winform上实现用鼠标进行涂鸦以及橡皮擦功能
我的涂鸦画线的逻辑是: 在picturebox的mousedown事件记录下鼠标的位置并转化成对应到图像上的点位,再调用 Cv2.Polylines() 来实现画线,结果测试都是OK的 ;而 橡皮擦的逻辑就是 跟画线差不多,都是先记录下相应点位,只是画的图像不同,我先创建一个与原图同大小的全为0的掩膜,然后再这个掩膜上进行画线,得到结果就是一张只有线部分区域不是0,其他空白部分都是0,然后再调用 CopyTo() 方法,并用上前面的掩膜,这样就将原来没有画过线的图像的点位置的像素赋值到新的需要进行擦除的图像上了。目前画各种线都是正常的 ,但是实现橡皮擦时 结果就不对了
下面是我画线的类 以及运行结果
class yLines
{
private int _thickness = 0;
//是否是橡皮
public bool IsEraser { set; get; }
//点位数据
public List<OpenCvSharp.Point> points = new List<Point>();
public yLines(bool IsEraser = false)
{
this.IsEraser = IsEraser;
}
//画笔粗细
public int thickness
{
set
{
_thickness = value;
if (_thickness <= 0)
_thickness = 1;
}
get
{
return _thickness;
}
}
//画笔颜色
public OpenCvSharp.Scalar color { set; get; }
//正常线
public Mat DrawLines(Mat src)
{
List<List<OpenCvSharp.Point>> tempL = new List<List<OpenCvSharp.Point>>();
tempL.Add(points);
Cv2.Polylines(src, tempL, false, color, thickness);
return src;
}
//橡皮
// 更新的图像为 src 最原始的图像为 oriImg 利用copyTo 将原始图像点位的像素覆盖到 src上实现橡皮擦
public Mat DrawEraser(Mat src, Mat oriImg)
{
Mat mask = Mat.Zeros(src.Size(), MatType.CV_8UC3);
if (src.Size() != oriImg.Size())
return mask;
List<List<OpenCvSharp.Point>> tempL = new List<List<OpenCvSharp.Point>>();
tempL.Add(points);
// mask只有线部分非0 其他都是0
Cv2.Polylines(mask, tempL, false, color, thickness);
oriImg.CopyTo(src, mask);
return src;
}
}
根据 IsEraser 变量去判断再绘画时调用 画线的方法是调用画橡皮的方法
能够擦除一些颜色 但是会留下原来的痕迹,是不是图像层的问题啊 运行时都是 MatType.CV_8UC3 啊
问题出在哪里了??