识别砖墙中的砖块

时间:2018-10-27 10:44:18

标签: python opencv shape-recognition

我遵循了不同的教程来识别OpenCV中的形状,但是其中大多数教程只是识别一张纸上的形状。我想将其带入“下一个”层次并识别真实图像中的形状。我认为下一步很简单,就是拍摄砖墙的图像并识别其中的所有砖块,因为它们应该具有相当简单的形状即可识别。我一直在使用以下图片作为练习:

wall.jpg

我的代码如下:

import cv2
import numpy as np

img = cv2.imread("imgs/wall.jpeg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#cv2.imshow('gray', gray)
#cv2.waitKey(0)

edges = cv2.Canny(gray,190,200,apertureSize = 3)
cv2.imshow('edges',edges)
cv2.waitKey(0)


_, contours,h = cv2.findContours(edges, 1,2)

for cnt in contours:
    approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True)
    if len(approx)==4:
        cv2.drawContours(img,[cnt],0,(0,0,255),2)

cv2.imshow("img", img)
cv2.waitKey(0)

所以我想到的第一件事是用精巧的边缘检测仪弄清这堵墙的所有边缘。这给了我以下图像:

canny.jpg

在此图像上,我们可以清楚地看到所有矩形,因此我想通过寻找轮廓来查找所有这些矩形将非常容易。但事实并非如此。如果我寻找轮廓,则会得到以下信息:

contours.jpg

显然不是我想要的。我也尝试过其他方法,例如斑点检测器或霍夫线,但似乎都没有用。如果有人可以给我一些提示,甚至告诉我应该怎么做,我真的很高兴!预先感谢!

2 个答案:

答案 0 :(得分:1)

这是一个方向: 假设图片在I

J=cv2.cvtColor(I,cv2.COLOR_BGR2HSV)
S=J[:,:,1]
(ret,T)=cv2.threshold(S,32,255,cv2.THRESH_BINARY)
cv2.imshow('win',T)
cv2.waitKey()

答案 1 :(得分:1)

好的,基于@Photon和@Silencer,我现在得到以下结果:

enter image description here

有一个小的补丁无法识别,但其余所有补丁似乎都可以识别。

如果有人对我的代码感兴趣,那就是:

// NOSONAR