使用opencv相关函数确定图片中的直线问题
作者:фора 发布时间:2021-01-11 11:30:14
标签: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()
看效果
来源:https://blog.csdn.net/qq_39023633/article/details/123588894


猜你喜欢
- 目录1.触发器是什么?2.创建触发器创建触发器的语法如下:创建多个执行语句的触发器: NEW和OLD的使用:3.使用触发器1.触发
- 本文实例讲述了python中二维阵列的变换方法。分享给大家供大家参考。具体方法如下:先看如下代码:arr = [ [1, 2, 3], [4
- 今天使用python计算数据相关性,但是发现计算出的表格中间好多省略号,而且也不对齐。这也太难看了。于是在程序里加了三行:pd.set_op
- 安装@vitejs/plugin-vue-jsxyarn add -D @vitejs/plugin-vue-jsxnpm i -D @vi
- SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一
- 下面就先定义一个函数: def foo(): print('function') foo() 在上述代码中,定义了一个名为f
- 苦逼的前夜昨晚很辛苦,搞到晚上快两点,最后还是没有把python3下的scrapy框架安装起来,后面还把yum这玩意给弄坏了,一直找不到命令
- 这次我使用ADO.NET来插入一条数据,到数据库中。主用到存储过程。我不想每次都是用SQL文本的形式了,那样始终没有进步~~~下面首先,我把
- 这些日子,几乎每个人都在谈论XML (Extensible Markup Language),但是很少有人真正理解其含义。XML的推崇者认为
- 1. 特定版本的python-opencv安装在https://www.lfd.uci.edu/~gohlke/pythonlibs/#op
- 高性能异步爬虫目的:在爬虫中使用异步实现高性能的数据爬取操作异步爬虫的方式:- 多线程、多进程(不建议):好处:可以为相关阻塞的操作单独开启
- 目录1、前言2、详解1、前言使用中如果我们想把python可识别对象的dict类型的数据通过str类型写入文件或者存入变量中就需要用到dum
- RPC是什么?所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,
- 实例如下所示:#coding=utf-8import jsonimport geventfrom django.http import Ht
- 在做接口自动化的时候,请求数据之前都是JSON格式的,Python有自带的包来解决。最近在做APP的接口,遇到XML格式的请求数据,费了很大
- 在 IT 开发中,有时我们需要对结构体数组进行排序。Go 语言提供了 sort 包,其中最常用的一种是 sort.Slice() 函数。但是
- Locate函数主要的作用是判断一个字符串是否包含另一个字符串,如Locate(str,sub) > 0,表示sub字符串包含str字
- 如下所示:# -*- coding: utf-8 -*-#简述:一个整数,它加上100和加上268后都是一个完全平方数#提问:请问该数是多少
- python版本:python 3.9 mutagen版本:1.46.0mutagen是一个处理音频元数据的pytho
- 1. 现在的日期时间命令是<%=now%> 即可2.ASP取得表格(from)数据输入的方法,是使用一个内置