使用hough直线检测,依赖opencv,以下是代码:
# encoding: utf-8
import cv2
import numpy as np
"""
1.图片得到极坐标直线
"""
img = cv2.imread('bag.png')
img1 = img.copy()
img2 = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 200, apertureSize=3)
"""
cv2.HoughLines(image, rho, theta, threshold, lines, minLineLength, maxLineGap)
src:输入图像,必须8-bit的灰度图像
rho:生成极坐标时候的像素扫描步长
theta:生成极坐标时候的角度步长
threshold:阈值,只有获得足够交点的极坐标点才被看成是直线
lines:输出的极坐标来表示直线
minLineLength:最小直线长度,比这个短的线都会被忽略。
maxLineGap:最大间隔,如果小于此值,这两条直线 就被看成是一条直线。
"""
lines = cv2.HoughLines(edges, 1, np.pi / 180, 50)
"""
2.极坐标直线转为直角坐标系直线
"""
result = []
for line in lines:
rho = line[0][0]
theta = line[0][1]
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(x0 + 1000 * (-b))
y1 = int(y0 + 1000 * (a))
x2 = int(x0 - 1000 * (-b))
y2 = int(y0 - 1000 * (a))
if x2 - x1 == 0:
print("直线是竖直的")
result=[90]
break
elif y2 - y1 == 0 :
print("直线是水平的")
result=[0]
break
else:
# 计算斜率
k = -(y2 - y1) / (x2 - x1)
# 求反正切,再将得到的弧度转换为度
angle = np.arctan(k) * 57.29577
# 得到一条直线的倾斜角度
result.append(angle)
cv2.line(img1, (x1, y1), (x2, y2), (0, 255, 0), 2)
print("袋口倾斜角度:",-np.array(list(filter(lambda x:x<0,result))).mean())
cv2.imshow('edges', img1)
print(lines)
cv2.waitKey(0)
您的采纳是我最大的动力,谢谢!!!
很容易实现 首先提取roi然后阈值分割 形态学变换 最小矩形 就ok了 代码回头发给你