识别图像的袋口方向,并返回角度

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

img


识别图像的袋口方向,并返回角度

img

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

img

img

您的采纳是我最大的动力,谢谢!!!

img

很容易实现 首先提取roi然后阈值分割 形态学变换 最小矩形 就ok了 代码回头发给你