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

作者:фора 时间:2021-01-11 11:30:14 

使用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()

看效果

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

来源:https://blog.csdn.net/qq_39023633/article/details/123588894

标签:opencv,函数,图片,直线
0
投稿

猜你喜欢

  • python中pip安装、升级以及升级固定的包

    2021-07-08 02:29:11
  • Python代码块批量添加Tab缩进的方法

    2022-10-10 16:41:39
  • 关于python环境变量如何配置

    2023-06-02 14:23:09
  • python海龟绘图之画国旗实例代码

    2022-03-06 14:57:23
  • 对numpy中数组元素的统一赋值实例

    2021-05-31 18:47:37
  • python 基本结构语句(函数和模块)

    2023-06-14 00:37:56
  • Python抽象类应用详情

    2022-03-24 17:41:13
  • Python入门教程(二十二)Python的类和对象

    2021-11-22 06:00:56
  • python实现通讯录管理系统

    2022-01-31 08:25:31
  • JavaScript解决Joseph问题

    2008-06-21 17:11:00
  • python实现拓扑排序的基本教程

    2021-03-24 04:24:02
  • django ModelForm修改显示缩略图 imagefield类型的实例

    2021-04-28 16:16:37
  • python多进程中的内存复制(实例讲解)

    2022-01-20 23:34:46
  • Python pytorch实现绘制一维热力图

    2022-04-03 21:09:14
  • 设计较好付款流程的12个建议

    2009-06-08 12:45:00
  • Python模块/包/库安装的六种方法及区别

    2021-11-03 15:53:56
  • 将pandas.dataframe的数据写入到文件中的方法

    2022-07-13 14:56:38
  • 使用PyWeChatSpy自动回复微信拍一拍功能的实现代码

    2021-08-28 21:15:07
  • python3 线性回归验证方法

    2022-12-03 10:49:09
  • Python全面解析json数据并保存为csv文件

    2021-02-14 03:26:26
  • asp之家 网络编程 m.aspxhome.com