c# 0pencvsharp 并行计算图像分块采用卡尺法找直线,找出与水平线夹角小于30度的最佳直线边编写函数输出直线的点

时间: 2024-05-06 21:18:10 浏览: 19
以下是一个使用OpenCVSharp和并行计算的示例代码,可以分块采用卡尺法找直线,并输出与水平线夹角小于30度的最佳直线的点: ```csharp using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Threading.Tasks; using OpenCvSharp; namespace OpenCVSharp_LineDetection { class Program { static void Main(string[] args) { // 读取图像 var img = Cv2.ImRead("test.jpg", ImreadModes.GrayScale); // 设置卡尺法的参数 var rho = 1; // 线的距离精度 var theta = Math.PI / 180; // 线的角度精度 var threshold = 100; // 线的最小投票数 var minLength = 100; // 线的最小长度 // 分块处理图像,每块大小为blockSize * blockSize var blockSize = 100; var blockList = GetBlockList(img.Width, img.Height, blockSize); var lines = new List<(Point, Point)>(); Parallel.ForEach(blockList, block => { // 在当前块中找到所有的直线 var linesInBlock = Cv2.HoughLines(img[block.Left:block.Right, block.Top:block.Bottom], rho, theta, threshold, minLength); // 将直线转换到原始图像坐标系中,并且筛选出与水平线夹角小于30度的直线 foreach (var line in linesInBlock) { var pt1 = new Point(line.P1.X + block.Left, line.P1.Y + block.Top); var pt2 = new Point(line.P2.X + block.Left, line.P2.Y + block.Top); var angle = GetAngle(pt1, pt2); if (angle < 30 || angle > 150) { lines.Add((pt1, pt2)); } } }); // 输出直线的点 foreach (var line in lines) { Console.WriteLine($"Line: ({line.Item1.X}, {line.Item1.Y}) - ({line.Item2.X}, {line.Item2.Y})"); } } // 计算两点之间的夹角 static double GetAngle(Point pt1, Point pt2) { var dx = pt1.X - pt2.X; var dy = pt1.Y - pt2.Y; return Math.Atan2(Math.Abs(dy), Math.Abs(dx)) * 180 / Math.PI; } // 获取图像分块的列表 static List<Rectangle> GetBlockList(int width, int height, int blockSize) { var blockList = new List<Rectangle>(); for (var x = 0; x < width; x += blockSize) { for (var y = 0; y < height; y += blockSize) { var blockWidth = Math.Min(blockSize, width - x); var blockHeight = Math.Min(blockSize, height - y); blockList.Add(new Rectangle(x, y, blockWidth, blockHeight)); } } return blockList; } } } ``` 在上面的代码中,我们首先读取了一张灰度图像,并设置了卡尺法的参数。然后我们使用`GetBlockList`函数将图像分成大小为`blockSize * blockSize`的块,并使用`Parallel.ForEach`进行并行处理。 在每个块中,我们使用`Cv2.HoughLines`函数找到所有的直线,并将直线转换到原始图像坐标系中。然后我们使用`GetAngle`函数计算每条直线与水平线的夹角,并筛选出夹角小于30度的直线。 最后,我们输出所有符合条件的直线的端点坐标。

相关推荐

最新推荐

recommend-type

C#直线的最小二乘法线性回归运算实例

主要介绍了C#直线的最小二乘法线性回归运算方法,实例分析了给定一组点,用最小二乘法进行线性回归运算的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
recommend-type

OpenCV识别提取图像中的水平线与垂直线

主要为大家详细介绍了OpenCV识别提取图像中的水平线与垂直线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

C#带控制点的贝塞尔Bezier曲线算法(源码)

使用c# + GDI+进行SVG等绘图,绘制带控制点的Bezier曲线。可用于点阵图像及矢量图形(如SVG)绘图。带源代码。
recommend-type

C#实现向函数传递不定参数的方法

主要介绍了C#实现向函数传递不定参数的方法,涉及C#操作函数参数的相关技巧,非常具有实用价值,需要的朋友可以参考下
recommend-type

C#中异步回调函数用法实例

主要介绍了C#中异步回调函数用法,实例分析了异步回调函数的定义及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB图像处理算法宝典:从理论到实战

![MATLAB图像处理算法宝典:从理论到实战](https://img-blog.csdnimg.cn/20200717112736401.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1emhhbzk5MDE=,size_16,color_FFFFFF,t_70) # 1. MATLAB图像处理基础理论 MATLAB图像处理是一种利用MATLAB编程语言进行图像处理的强大工具。它提供了丰富的函数和工具箱,用于图像获取、增强、分
recommend-type

matlab中1/x的非线性规划

在MATLAB中,可以使用非线性规划函数(`fmincon`)来优化一个包含1/x的非线性目标函数。下面是一个简单的例子: ```matlab % 定义目标函数 fun = @(x) 1/x; % 定义约束函数(这里没有约束) nonlcon = []; % 定义初始点 x0 = 1; % 定义优化选项 options = optimoptions('fmincon', 'Display', 'iter'); % 进行非线性规划 [x, fval] = fmincon(fun, x0, [], [], [], [], [], [], nonlcon, options); ``` 在
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。