C# OpenCV 根据点集截取图像

通用方法,适用于各种形式的图像类型

/// <summary>
/// 根据输入的点集截取ROI
/// </summary>
/// <param name="points">输入的list点集</param>
/// <param name="InputMat">输入被截取的图像</param>
/// <returns></returns>
public static Mat CropROI(List<Point> points,Mat InputMat)
{
    // 创建一个和原图像同样大小的遮罩图像,初始化为全0(表示全部不保留)
    Mat mask1 = Mat.Zeros(InputMat.Rows, InputMat.Cols, MatType.CV_32FC1);

    // 使用多边形填充函数将旋转矩形内部填充为1(表示感兴趣区域),外部为0
    Cv2.FillPoly(mask1, new[] { points }, new Scalar(1));

    // 将原图像与遮罩图像对应元素相乘,实现ROI以外像素置0的效果
    Cv2.Multiply(InputMat, mask1, InputMat);
    mask1.Dispose();
    return InputMat;
}

常用的转换为List《Point》的代码

List<Point2f> list = new List<Point2f>();
List<Point> pointList = list.ConvertAll(point2f => new Point((int)point2f.X, (int)point2f.Y));

Point[] points = new Point();
List<Point> pointList = new List<Point>(points).ToList();

仅适用于CV_8UC1的图像。

/// <summary>
/// 根据旋转矩形截取图像
/// </summary>
/// <param name="Input"></param>
/// <param name="rotatedRect"></param>
/// <returns></returns>
public static Mat CropMatRoat(Mat Input,RotatedRect rotatedRect)
{
    Mat result = new Mat();
    Point2f[] vertices = rotatedRect.Points();
    Point[] points = new Point[vertices.Length];
    for (int i = 0; i < vertices.Length; i++)
    {
        points[i] = (Point)vertices[i];
    }
    Mat mask = new Mat(Input.Size(), MatType.CV_8UC1);
    int[] npt = { vertices.Length };

    // 使用给定的多边形顶点填充掩码图像为白色(像素值为255)
    Cv2.FillPoly(mask, new Point[][] { points }, new Scalar(255), LineTypes.Link8);
    //mask.ImWrite("D:\\test\\mask.bmp");

    Cv2.BitwiseAnd(Input, Input, result, mask);
    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值