OpencvSharp霍夫变换查找直线,计算角度

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();

            }
        }


    }
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金增辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值