如何检测图片中的物体是否倾斜?

图像背景比较复杂

 

track

 

把正和斜的图片放在两个类中,用深度学习的方法来训练。 

应该可以,对照对象是中间那条铁条。

如果图像都是这样的话  阈值分割  找到黑色的左右边界坐标,然后判断最上面的点和最下面的点x轴的差异

目前我已经试过阈值分割加直线检测的方式计算倾斜 但是效果并不是很好没法准确定位黑色边界

关于深度学习方式效果也不是很好 很难区分角度倾斜比较小的物体

有没有彩色的,这两个不好分也。

斜的,分成这样:

加 contour:

现在是怎么找角。

你们认为只是找左上和左下够不够?拉一条线。

现在好多了,求四点。

怎么计算角度?

忘了,拿本中学数学看看。

左上 1, 左中 2, 左下3, 右中 4

tan A = m (坡度)= (y2 - y1) / (x2 - x1)

线13坡度: m13 = (y3 - y1) / (x3 - x1)  = (p3[1] - p1[1]) / (p3[0] - p1[0]),  

线24坡度: m24 = (y4 - y2) / (x4 -x2) = (p4[1] - p2[1]) / (p4[0] - p2[0]),

两线夹角Z:tan Z = | (m2 - m1) / ( 1+m1m2) | 

两线夹角:tanZ = abs( (m24 - m13) / (1 + m24*m13) )

def getAngle(p1, p2, p3, p4):
    m13 = (p3[1] - p1[1]) / (p3[0] - p1[0])
    m24 = (p4[1] - p2[1]) / (p4[0] - p2[0])
    tanZ = abs( (m24 - m13) / (1 + m24*m13) )
    return math.atan(tanZ)

答案错误。atan 没用。

忘了加 degrees:return math.degrees( math.atan(tanZ) )

夹角是: 86.22345547864316  < 90,偏约 3.78 度。

    text = None
    if abs(angleZ - 90) > 2:
        text = "垂直: 否"
        img = cv2ImgAddText(img, text, 40, 920, (255, 255, 0), 60)
    else:
        text = "垂直: 是"
        img = cv2ImgAddText(img, text, 140, 60, (255, 255, 0), 30)

差两度合适吗?

两副图尺寸为什么不一样?

调了一下,两幅图都可以测。Thresh 值是 30。斜的那个变成缺腿的。

 

 

请问在检测到边缘之后,图中标注的那些点是怎么得到的?

还有请问这个阈值30是如何得到的

_, thresh = cv2.threshold(gray, trackbar_val, 255, cv2.THRESH_BINARY_INV)

trackbar 你应该会了。

 

contour:

cnts, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

 

面积:

area = cv2.contourArea(cnt)

保大的,不要小的。

 

交叉点:

approx = cv2.approxPolyDP(cnt, 0.009 * cv2.arcLength(cnt, True), True)
n = approx.ravel()
i = 0

for j in n:
    if i % 2 == 0:
        x = n[i]
        y = n[i + 1]

x 和 y 都有了。

 

track

 

trackbar 文章: https://editor.csdn.net/md/?articleId=113362767

发错了,这个你才能看: https://blog.csdn.net/fly_bear_unknown/article/details/113362767

这是上一集:https://blog.csdn.net/fly_bear_unknown/article/details/112265085

请点评点评,谈谈那里可以搞笑的地方。