我正在使用以下代码来检测图像中的某些形状:
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)它不能正常运行。
我已经尝试过使用模糊和canny,但我无法使第二张照片足够顺畅。
我希望有人可以提供帮助!
答案 0 :(得分:0)
可能使用固定阈值(在您的情况下为127),如果相机拍摄的照片不是一个好主意(虽然它在抽象的情况下工作,当形状是纯色而不受阴影影响时)。似乎127对于您提供的图像而言价值太高。
为什么不试试Otsu method? Here's一个如何在opencv中使用python的例子。它会使阈值水平对于摄像机拍摄的图像中的真实环境不变。