对数据集合list按照大小分块 比如按照5分块

1.用法很简单只需要调用一个API就行

package com.atguigu.yygh.cmn.controller;

import org.apache.commons.collections4.ListUtils;

import java.util.ArrayList;
import java.util.List;

public class Test2 {

    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();
        list.add(new Student("张三",16));
        list.add(new Student("张四",19));
        list.add(new Student("李五",15));
        list.add(new Student("张马六",16));
        list.add(new Student("张马六",16));
        List<List<Student>> partitionList = ListUtils.partition(list, 2);
        System.out.println("3666"); //分块后的大小  2   2   1
        System.out.println(partitionList.size());

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用OpenCVSharp的HoughLinesP方法来实现卡尺法找直线,并行计算可以使用Parallel.ForEach方法。具体步骤如下: 1. 将图像分块,使用Parallel.ForEach方法并行计算每个块的直线。 2. 对每个块进行边缘检测,可以使用Canny方法。 3. 使用HoughLinesP方法得到每个块的直线候选集合。 4. 对每个块的直线进行筛选,找出与水平线夹角小于30度的最佳直线边。 以下是示例代码: ```csharp // 分块大小 int blockSize = 50; // 水平线夹角阈值 double threshold = 30 * Math.PI / 180; // 原始图像 Mat src = Cv2.ImRead("image.jpg", ImreadModes.GrayScale); // 分块 List<Rect> blocks = new List<Rect>(); for (int y = 0; y < src.Rows; y += blockSize) { for (int x = 0; x < src.Cols; x += blockSize) { Rect block = new Rect(x, y, Math.Min(blockSize, src.Cols - x), Math.Min(blockSize, src.Rows - y)); blocks.Add(block); } } // 并行计算每个块的直线 List<LineSegmentPolar[]> linesList = new List<LineSegmentPolar[]>(); Parallel.ForEach(blocks, block => { // 边缘检测 Mat blockImage = src[block]; Mat edges = new Mat(); Cv2.Canny(blockImage, edges, 50, 200); // HoughLinesP LineSegmentPolar[] lines = Cv2.HoughLinesP(edges, 1, Math.PI / 180, 50, 0, 0); // 筛选直线 List<LineSegmentPolar> selectedLines = new List<LineSegmentPolar>(); foreach (LineSegmentPolar line in lines) { double angle = Math.Abs(line.Theta - Math.PI / 2); if (angle < threshold) { selectedLines.Add(line); } } linesList.Add(selectedLines.ToArray()); }); // 合并直线 List<LineSegmentPolar> allLines = new List<LineSegmentPolar>(); foreach (LineSegmentPolar[] lines in linesList) { allLines.AddRange(lines); } // 求解最佳直线 LineSegmentPolar bestLine = Cv2.FitLine(allLines.ToArray(), DistanceTypes.L2, 0, 0.01, 0.01); // 绘制最佳直线 Mat result = src.CvtColor(ColorConversionCodes.GRAY2BGR); result.LinePolar(bestLine.Rho, bestLine.Theta, new Scalar(0, 0, 255), 2); Cv2.ImShow("Result", result); Cv2.WaitKey(); ``` 注意事项: 1. 分块大小需要根据图像大小和计算能力进行调整,太小会导致并行计算的开销过大,太大会导致直线检测不准确。 2. 并行计算直线时需要注意线程安全,可以使用线程局部存储(ThreadLocal)来存储每个线程的直线结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值