opencv 直线检测笔记

目录

c++

检测垂直线 

检测所有线:

python RANSAC直线检测


c++

C++: void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )

第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。

第二个参数,InputArray类型的lines,经过调用HoughLinesP函数后后存储了检测到的线条的输出矢量,每一条线由具有四个元素的矢量(x_1,y_1, x_2, y_2)  表示,其中,(x_1, y_1)和(x_2, y_2) 是是每个检测到的线段的结束点。
第三个参数,double类型的rho,以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径。
第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。
第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。
第六个参数,double类型的minLineLength,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
第七个参数,double类型的maxLineGap,有默认值0,允许将同一行点与点之间连接起来的最大的距离。

原文链接:https://blog.csdn.net/cqltbe131421/article/details/60870466

检测垂直线 


	Mat src = imread("F:/project/jushi/ellipse_detector-sdk/images/04_00010.bmp", IMREAD_COLOR);

	Mat canny;
	Canny(src, canny, 100, 250);
	imshow("canny", canny);

	vector<Vec2f> lines;
	HoughLines(canny, lines, 1.0, CV_PI / 180, 102, 0, 0, 0,0.1); //垂直直线
	//依次在图中绘制出每条线段
	for (size_t i = 0; i < lines.size(); i++)
	{
		float rho = lines[i][0], theta = lines[i][1];
		Point pt1, pt2;
		double a = cos(theta), b = sin(theta);
		double x0 = a * rho, y0 = b * rho;
		pt1.x = cvRound(x0 + 2000 * (-b));  //把浮点数转化成整数
		pt1.y = cvRound(y0 + 2000 * (a));
		pt2.x = cvRound(x0 - 2000 * (-b));
		pt2.y = cvRound(y0 - 2000 * (a));
		line(src, pt1, pt2, Scalar(255), 1, CV_AA);
	}

	imshow("src", src);
	waitKey(0);


检测所有线:

	Mat src = imread("F:/project/jushi/ellipse_detector-sdk/images/04_00010.bmp", IMREAD_COLOR);

	Mat src1, src2, src3, src4, dst;
	namedWindow("效果图窗口", 1);//定义窗口
	Canny(src, src1, 50, 200, 3);//进行一此canny边缘检测
	cvtColor(src1, src2, CV_GRAY2BGR);//转化边缘检测后的图为灰度图
	vector<Vec4i> lines; //定义一个矢量结构lines用于存放得到的线段矢量集合
		//HoughLines(src1, lines, 1, CV_PI / 180, 150, 0, 0);  
		HoughLinesP(src1, lines, 1, CV_PI / 180, 80, 50, 10);//进行霍夫线变换
	for (size_t i = 0; i < lines.size(); i++)
	{
		
			float rho = lines[i][0], theta = lines[i][1];
		Point pt1, pt2;
		double a = cos(theta), b = sin(theta);
		double x0 = a * rho, y0 = b * rho;
		pt1.x = cvRound(x0 + 1000 * (-b));
		pt1.y = cvRound(y0 + 1000 * (a));
		pt2.x = cvRound(x0 - 1000 * (-b));
		pt2.y = cvRound(y0 - 1000 * (a));
		Vec4i l = lines[i];
		line(src2, pt1, pt2, Scalar(55, 100, 195), 1, CV_AA);
	}
	imshow("效果图窗口1", src1);
	
	imshow("效果图窗口2", src2);
	waitKey(0);
	
	
	

python RANSAC直线检测

import cv2
import numpy as np

# 读取图像,并将其转换为灰度图像
image = cv2.imread('your_image.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 应用二值化操作
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)

# 查找轮廓
contours, _ = cv2.findContours(binary_image, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

# 对于检测到的每个轮廓,使用 RANSAC 方法拟合直线
for contour in contours:
    # 至少需要两个点来拟合直线
    if contour.shape[0] >= 2:
        # 使用 fitLine 得到直线的参数
        # 你可以尝试使用 cv2.DIST_HUBER 或 cv2.DIST_RANSAC
        line_parameters = cv2.fitLine(contour, cv2.DIST_L2, 0, 0.01, 0.01)
        vx, vy, x, y = line_parameters.flatten()

        # 计算直线的两个端点
        lefty = int((-x * vy / vx) + y)
        righty = int(((gray_image.shape[1] - x) * vy / vx) + y)

        # 绘制直线
        cv2.line(image, (gray_image.shape[1] - 1, righty), (0, lefty), (0, 255, 0), 2)

# 展示结果
cv2.imshow('Detected Lines with RANSAC', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV在不同版本中提供了不同的直线检测方法。在OpenCV 3中,加入了LSD(Line Segment Detector)直线检测算法。但是在OpenCV 4中,由于许可证问题,LSD直线检测算法被移除了。引用和展示了使用OpenCV进行直线检测的代码示例。 在引用中的代码示例中,使用了Canny边缘检测算法和自定义的CannyLine类来实现直线检测。首先,将图像读取为灰度图像,然后通过Canny边缘检测算法获取边缘。接下来,使用CannyLine类中的cannyLine函数检测直线,并通过cv::line函数在图像上绘制检测到的直线。 在引用中的代码示例中,使用了FLD(Fast Line Detector)直线检测算法。首先,将图像读取为灰度图像,然后使用cv2.ximgproc.createFastLineDetector()创建一个FLD对象。接下来,使用fld.detect函数检测直线,并通过cv2.line函数在图像上绘制检测到的直线。 通过这两个代码示例,可以实现直线检测并在图像上绘制检测到的直线。在OpenCV 4中,可以使用其他的直线检测算法,如Hough Transform等来实现直线检测。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Opencv中的直线检测算法](https://blog.csdn.net/juluwangriyue/article/details/116109730)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [opencv 九种直线检测方法汇总](https://blog.csdn.net/m0_51233386/article/details/124171578)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值