0

我正在使用以下代码来检测图像中的某些形状:

import cv2
import numpy as np

img = cv2.imread("006.jpg")

grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret,thresh = cv2.threshold(grey,127,255,1)

cv2.imshow('img',thresh)
cv2.waitKey(0)

contours, h = cv2.findContours(thresh, 1, cv2.CHAIN_APPROX_SIMPLE)
contours.sort(key = len)
for contour in contours:

    approx = cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour, True), True)

    #star - > yellow
    if len(approx) == 10:
        cv2.drawContours(img, [contour],0, (0,255,255), -1)

    #circle -> black
    elif len(approx) >= 11:
        cv2.drawContours(img, [contour], 0, (0,0,0), -1)

    #triangle -> green
    elif len(approx) == 3:
        cv2.drawContours(img,[contour],0,(0,255,0),-1)

    #square -> blue
    elif len(approx) == 4:
        cv2.drawContours(img, [contour],0, (255,0,0),-1)

    #pentagon -> red
    elif len(approx) == 5:
        cv2.drawContours(img, [contour],0, (0,0,255), -1)

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

此代码适用于我计算机上的图像,但是当我打印出图像时,从其上取下一张照片并尝试再次在其上运行代码(如此处:image)它不能正常工作。

我已经尝试过使用模糊和精明,但我无法足够平滑我的第二张照片。

我希望有人能帮帮忙!

4

1 回答 1

0

可能使用固定阈值(在您的情况下为 127)对于相机拍摄的照片不是一个好主意(尽管它在抽象情况下有效,当形状是不受阴影影响的纯色时)。看来 127 对于您提供的图像来说价值太高了。

您为什么不尝试使用Otsu 方法这是一个如何在 opencv 中使用 python 的示例。在相机拍摄图像的情况下,它将使阈值水平对您获得的真实环境保持不变。

于 2014-11-16T17:44:30.750 回答