using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
string imagePath = @"1.png";
HoughtLine(imagePath);
}
/// <summary>
/// 霍夫变换-直线
/// </summary>
/// <param name="imagePath"></param>
private static void HoughtLine(string imagePath)
{
using (Mat srcLine = new Mat(imagePath, ImreadModes.AnyColor | ImreadModes.AnyDepth))
using (Mat dst = new Mat(srcLine.Size(), MatType.CV_8UC3, Scalar.Blue))
{
// 1:边缘检测
Mat canyy = new Mat(srcLine.Size(), srcLine.Type());
Cv2.Canny(srcLine, canyy, 60, 200, 3, false);
/*
* HoughLinesP:使用概率霍夫变换查找二进制图像中的线段。
* 参数:
* 1; image: 输入图像 (只能输入单通道图像)
* 2; rho: 累加器的距离分辨率(以像素为单位) 生成极坐标时候的像素扫描步长
* 3; theta: 累加器的角度分辨率(以弧度为单位)生成极坐标时候的角度步长,一般取值CV_PI/180 ==1度
* 4; threshold: 累加器阈值参数。只有那些足够的行才会返回 投票(>阈值);设置认为几个像素连载一起才能被看做是直线。
* 5; minLineLength: 最小线长度,设置最小线段是有几个像素组成。
* 6;maxLineGap: 同一条线上的点之间连接它们的最大允许间隙。(默认情况下是0):设置你认为像素之间间隔多少个间隙也能认为是直线
* 返回结果:
* 输出线。每条线由一个4元向量(x1, y1, x2,y2)
*/
LineSegmentPoint[] linePiont = Cv2.HoughLinesP(canyy, 1, Math.PI / 180, 620, 1, 10);//只能输入单通道图像
Scalar color = new Scalar(0, 255, 255);
for (int i = 0; i < linePiont.Count(); i++)
{
Point p1 = linePiont[i].P1;
Point p2 = linePiont[i].P2;
Console.WriteLine($"{p1.X},{p1.Y}");
Console.WriteLine($"{p2.X},{p2.Y}");
Cv2.Line(dst, p1, p2, color, 4, LineTypes.Link8);
//double tanValue2 = 1;//正切值
double tanValue2 = (p1.Y - p2.Y) /(p1.X - p2.X);//正切值
double tanRadianValue2 = Math.Atan(tanValue2);//求弧度值
double tanAngleValue2 = tanRadianValue2 / Math.PI * 180;//求角度
Console.WriteLine(tanAngleValue2);
}
//Cv2.ImShow("DST", canyy);
//Cv2.WaitKey();
//Cv2.ImShow("DST", srcLine);
//Cv2.WaitKey();
Cv2.ImShow("DST", dst);
Cv2.WaitKey();
}
}
}
}
OpencvSharp霍夫变换查找直线,计算角度
最新推荐文章于 2025-12-12 12:02:45 发布
990

被折叠的 条评论
为什么被折叠?



