1

我按照不同的教程来识别 OpenCV 中的形状,但这些教程中的大多数只是识别一张纸上的形状。我想把它带到“下一个”层次并识别真实图像中的形状。我认为一个简单的下一步是拍摄一堵砖墙的图像并识别其中的所有砖块,因为它们应该有一个相当简单的形状来识别。我一直在使用以下图像作为练习:

墙.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)

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

精明的.jpg

在这张图片上,我们可以清楚地看到所有的矩形,所以我的想法是通过寻找轮廓很容易找到所有这些矩形。但事实证明并非如此。如果我寻找轮廓,我会得到以下信息:

轮廓.jpg

这显然不是我想要的。我也一直在尝试不同的东西,比如斑点检测器或霍夫线,但似乎都没有奏效。如果有人能给我一些建议,甚至告诉我应该怎么做,我真的会很高兴!提前致谢!

4

2 回答 2

3

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

在此处输入图像描述

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

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

import cv2
import random

img = cv2.imread("imgs/wall.jpeg")

# To hsv
hsv =cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

# Get the Saturation out
S=hsv[:,:,1]

# Threshold it
(ret,T)=cv2.threshold(S,42,255,cv2.THRESH_BINARY)

# Show intermediate result
cv2.imshow('win',T)
cv2.waitKey(0)

# Find contours
_, contours,h = cv2.findContours(T, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

#img2 = img.copy()


for c in contours:
    area = cv2.contourArea(c)
    # Only if the area is not miniscule (arbitrary)
    if area > 100:
        (x, y, w, h) = cv2.boundingRect(c)

        # Uncomment if you want to draw the conours
        #cv2.drawContours(img, [c], -1, (0, 255, 0), 2)

        # Get random color for each brick
        tpl = tuple([random.randint(0, 255) for _ in range(3)])
        cv2.rectangle(img, (x, y), (x + w, y + h), tpl, -1)

cv2.imshow("bricks", img)
cv2.waitKey(0)
于 2018-10-27T12:54:21.253 回答
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()
于 2018-10-27T10:57:24.513 回答