使用opencv相关函数确定图片中的直线问题

 更新时间:2022年11月10日 10:26:25   作者:фора 快跑  
这篇文章主要介绍了使用opencv相关函数确定图片中的直线问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用opencv相关函数确定图片中的直线

 
#pip install opencv-python==4.4.0.42 opencv-contrib-python==4.4.0.42
 
import cv2
import numpy as np
from matplotlib import pyplot as plt
 
import matplotlib.image as mpimg
import matplotlib as mpl
from PIL import Image
mpl.rcParams['figure.dpi'] = 200
 
#加载图像
img = cv2.imread('test.png')
plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
#灰度图像
img1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#cornerHarris要求img是flaot32位
img1 = np.float32(img1)
#Harris角点检测函数
#  • img - 数据类型为 float32 的输入图像。
#  • blockSize - 角点检测中要考虑的领域大小。
#  • ksize - Sobel 求导中使用的窗口大小
#  • k - Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06].
dst = cv2.cornerHarris(img1,10,3,0.04)
plt.axis('off')
plt.imshow(dst, cmap='gray')
plt.show()
#膨胀
dst = cv2.dilate(dst,None)
plt.axis('off')
plt.imshow(dst, cmap='gray')
plt.show()
#显示经过处理后的图片
threshold = 0.01*dst.max()
img[dst>threshold]=[255,0,0] 
#[255,0,0] - 点的颜色:蓝色, [0,255,0] - 绿色, [0,0,255] - 红色,
#[0,0,0] -白色, [255,255,255] - 黑色
plt.axis('off')
plt.imshow(img, cmap='gray')
plt.show()
 
#使用另一种角点检测函数
corners = cv2.goodFeaturesToTrack(gray, 6, 0.01, 5)
corners = np.int0(corners) 
for i in corners:
    x, y = i.ravel()
    cv2.circle(img, (x, y), 5, [0,0,0], -1) 
plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
 
#直线检测
 
img = cv2.imread("road.jpeg")
plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
 
#canny 方法检测边缘 返回二值图像
edges = cv2.Canny(gray, 150, 300)
plt.axis('off')
plt.imshow(edges, cmap='gray')
plt.show()
#HoughLinesP方法判断哪些边缘是直线
 
lines = cv2.HoughLinesP(edges, rho=1.0,theta=np.pi/180,threshold=20,minLineLength=30,maxLineGap=10)
line_img = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8) 
line_color = [0, 255, 0]
line_thickness = 2
dot_color = [0, 255, 0]
dot_size = 3
 
#讲检测的直线叠加到原图
for line in lines:
    for x1, y1, x2, y2 in line:
        cv2.line(line_img, (x1, y1), (x2, y2), line_color, line_thickness)
        cv2.circle(line_img, (x1, y1), dot_size, dot_color, -1)
        cv2.circle(line_img, (x2, y2), dot_size, dot_color, -1)
final = cv2.addWeighted(img, 0.8, line_img, 1.0, 0.0) 
plt.axis('off')
plt.imshow(cv2.cvtColor(final, cv2.COLOR_BGR2RGB))
plt.show()
 

OpenCV:直线检测

主要介绍OpenCV自带的直线检测函数HoughLines()的用法,这个函数的第一个参数是一个二值化图像,所以在进行霍夫变换之前要首先进行二值化,或者进行Canny 边缘检测。第二和第三个值分别代表β 和 θ 的精确度。

第四个参数是阈值,只有累加其中的值高于阈值时才被认为是一条直线,也可以把它看成能检测到的直线的最短长度(以像素点为单位)。返回值就是(β; θ)。β 的单位是像素,θ的单位是弧度。

看代码 

#直线检测
#使用霍夫直线变换做直线检测,前提条件:边缘检测已经完成
import cv2 as cv
import numpy as np
import matplotlib.pylab as plt
 
#标准霍夫线变换
def line_detection(image):
    gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
    edges = cv.Canny(gray, 50, 150, apertureSize=3)  #apertureSize参数默认其实就是3
    cv.imshow("edges", edges)
    lines = cv.HoughLines(edges, 1, np.pi/180, 80)
    for line in lines:
        rho, theta = line[0]  #line[0]存储的是点到直线的极径和极角,其中极角是弧度表示的。
        a = np.cos(theta)   #theta是弧度
        b = np.sin(theta)
        x0 = a * rho    #代表x = r * cos(theta)
        y0 = b * rho    #代表y = r * sin(theta)
        x1 = int(x0 + 1000 * (-b)) #计算直线起点横坐标
        y1 = int(y0 + 1000 * a)    #计算起始起点纵坐标
        x2 = int(x0 - 1000 * (-b)) #计算直线终点横坐标
        y2 = int(y0 - 1000 * a)    #计算直线终点纵坐标    注:这里的数值1000给出了画出的线段长度范围大小,数值越小,画出的线段越短,数值越大,画出的线段越长
        cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)    #点的坐标必须是元组,不能是列表。
    cv.imshow("image-lines", image)
 
#统计概率霍夫线变换
def line_detect_possible_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
    edges = cv.Canny(gray, 50, 150, apertureSize=3)  # apertureSize参数默认其实就是3
    lines = cv.HoughLinesP(edges, 1, np.pi / 180, 60, minLineLength=60, maxLineGap=5)
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
    cv.imshow("line_detect_possible_demo",image)
 
src = cv.imread(r'..\edge.jpg')
print(src.shape)
cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
cv.imshow('input_image', src)
line_detection(src)
src = cv.imread(r'..\edge.jpg') #调用上一个函数后,会把传入的src数组改变,所以调用下一个函数时,要重新读取图片
line_detect_possible_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

看效果

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python Docx库完美操作word文档实例探究

    Python Docx库完美操作word文档实例探究

    这篇文章主要为大家介绍了Python Docx库完美操作word文档,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • python matplotlib画图时坐标轴重叠显示不全和图片保存时不完整的问题解决

    python matplotlib画图时坐标轴重叠显示不全和图片保存时不完整的问题解决

    最近工作中遇到了matplotlib保存图片坐标轴不完整的问题,所以这篇文章主要给大家介绍了关于python matplotlib画图时坐标轴重叠显示不全和图片保存时不完整问题的解决方法,需要的朋友可以参考下
    2022-07-07
  • Python AutoCAD 系统设置的实现方法

    Python AutoCAD 系统设置的实现方法

    这篇文章主要介绍了Python AutoCAD 系统设置的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Python入门之面向对象和类

    Python入门之面向对象和类

    这篇文章主要为大家介绍了Python面向对象和类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 使用Anaconda创建Pytorch虚拟环境的排坑详细教程

    使用Anaconda创建Pytorch虚拟环境的排坑详细教程

    PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序,下面这篇文章主要给大家介绍了关于使用Anaconda创建Pytorch虚拟环境的相关资料,需要的朋友可以参考下
    2022-12-12
  • 浅谈Python 命令行参数argparse写入图片路径操作

    浅谈Python 命令行参数argparse写入图片路径操作

    这篇文章主要介绍了浅谈Python 命令行参数argparse写入图片路径操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Python常用编码的区别介绍

    Python常用编码的区别介绍

    这篇文章介绍了Python常用编码的区别,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 一些让Python代码简洁的实用技巧总结

    一些让Python代码简洁的实用技巧总结

    随着项目代码行数的增加,不可避免的遇到软件架构腐败的问题,所以如何写出简洁的代码至关重要,这篇文章主要给大家介绍了一些让Python代码简洁的实用技巧,需要的朋友可以参考下
    2021-08-08
  • Python使用pip安装报错:is not a supported wheel on this platform的解决方法

    Python使用pip安装报错:is not a supported wheel on this platform的解决

    这篇文章主要介绍了Python使用pip安装报错:is not a supported wheel on this platform的解决方法,结合实例形式分析了在安装版本正确的情况下pip安装报错的原因与相应的解决方法,需要的朋友可以参考下
    2018-01-01
  • 迁移现有的python项目到pyproject.toml

    迁移现有的python项目到pyproject.toml

    本文将详细介绍将现有的 Python 项目迁移到 pyproject.toml,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04

最新评论