0
私は長方形、台形、半円を区別しようとしていました。だから、私がしたことは、形状の周りに輪郭を描き、回転した四角形を描いた。その後、私は輪郭と回転した矩形の領域を見つけ出し、それらの比率を取る。この比率を使用して、以前に言及した3つの図形が異なるため、図形を決定します。 (誰もがこれら三つを区別するために、より堅牢な方法を持っている場合は当然のことでしょう。)適切な輪郭を得ることができません
は問題に来ます。私はイメージの周りに適切な輪郭を描くことができません。ここで は、入力と出力の画像です:
ここに私のコードは、事前に
import cv2
import numpy as np
img = cv2.imread('h4.JPG')
cv2.imshow('Input',img)
#img = cv2.resize(img, None, fx=0.2,fy=0.2)
img = cv2.GaussianBlur(img, (11,11), 0)
img = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)
im = img.copy()
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,0,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
max = 0
for c in contours:
area = cv2.contourArea(c)
print area
if(np.any(max <= area)):
max = c
A, B, C = cv2.minAreaRect(c)
rotrect = cv2.minAreaRect(c)
box = cv2.cv.BoxPoints(rotrect)
box = np.int0(box)
cv2.drawContours(im, contours, 0, (0,255,0), 2)
cv2.drawContours(im, [box], 0, (0,0,255), 2)
areaS = cv2.contourArea(contours[0])
areaR = B[0]*B[1]
Ratio = areaS/areaR
print "Shape Area: ",areaS
print "Shape Rect: ",areaR
print "Ratio: ",Ratio
cv2.imshow('Output',im)
if cv2.waitKey() and 0xff == 27:
cv2.destroyAllWindows()
おかげです。
使用高い閾値: 'RET、脱穀= cv2.threshold(imgray、127255、cv2.THRESH_BINARY)' 。 _denoising_は、 'findContours'によって_foreground_とみなされる0でないピクセルを作成します。 – Miki
Thanks @Miki。それは助けになった。しかし、あなたが具体的に127をしきい値として選択した理由を教えてください。 – StupidGuy
低い値(ほとんど黒色)を取り除くのに十分なほど高いが、高い値(ほとんど白い)を取り除くにはそれほど高くはない。 127は中央にある;)。 30から220のものはおそらく同様に働いていたでしょう – Miki