認識したいものを外接矩形で検出しその際、余計なものを検出した際矩形幅で判断してあげたいと思っています。
ここでは白い線だけを検出したいと思っています。
回転の考慮した外接矩形の4点を取得し、そのうちの2点を用いて矩形幅を計算したのですが認識する物体の角度によって4点の座標の位置がバラバラになってしまいます。
座標がバラバラでも対応できるように2通りの計算方法で幅の値を出しました。
幅の値がいくつも出たりしてうまくいきません。
条件文を用いて、矩形幅のしきい値で指定する方法に手こずっています。
python
1import cv2 2import math 3import numpy as np 4 5img_src = cv2.imread("image.ppm") 6gauss = cv2.GaussianBlur(img_src,(11,11),0)#9,9 7gray = cv2.cvtColor(gauss,cv2.COLOR_BGR2GRAY) 8#dst = cv2.fastNlMeansDenoising(gray,None,10,10,7,21) 9ret,th1 = cv2.threshold(gray,200,255,cv2.THRESH_BINARY) 10#th1 = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ 11# cv2.THRESH_BINARY,25,10) 12 13edges = cv2.Canny(th1,50,150)#(100,150) 14 15img, contours, hierarchy = cv2.findContours(th1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1) 16if len(contours) > 0: 17 for i in range(0, len(contours)): 18 19 cnt = contours[i] 20 M = cv2.moments(cnt) 21 #print(M) 22 area = cv2.contourArea(cnt) 23 print(area) 24 if 500 < area < 5000: 25 26 rect = cv2.minAreaRect(contours[i]) 27 box = cv2.boxPoints(rect) 28 #print(box) 29 box = np.int0(box) 30 x1,x2,x3,x4 = np.int0(box) 31 a = np.array(x1) 32 b = np.array(x2) 33 c = np.array(x3) 34 d = np.array(x4) 35 #d = math.sqrt((x4-x1)** 2) 36 I = np.linalg.norm(c-b) 37 J = np.linalg.norm(d-c) 38 print(x1,x2,x3,x4) 39 print(I) 40 print(J) 41 #print(box) 42 im = cv2.drawContours(img_src,[box],0,(0,255,0),2) 43 44cv2.imshow('src', img_src) 45cv2.imshow("1", th1) 46cv2.imshow("2", edges) 47cv2.waitKey() 48cv2.destroyAllWindows() 49
<1枚目>
(①)
1194.5 (矩形面積)
[319 19] [222 19] [222 0] [319 0] (4点の座標)
19.0
97.0
20.5
(②)
2548.5
[318 117] [42 51] [45 39] [321 105]
12.3693168769
283.781606169
<2枚目>
(①)
1877.0
[ 0 39] [-2 10] [173 -5] [175 23]
175.641680703
28.0713376952
(②)
1487.0
[ 0 70] [-1 61] [268 1] [270 10]
275.610232031
9.21954445729
2.5
33.0
0.0
4点の座標の開始位置の固定方法や矩形幅の求め方など、なにか良い方法があれば教えていただきたいです。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/27 10:09