四角の中に一つだけ四角があるものを選ぼうの回
ちょっと前に作ったfindcontourを改造してみました。
やりたかったこととしましては、↓の図のピンクのやつだは取らず、他の四角はとるってやつです。
四角の中に一つだけ四角があるものを取ったのです。
python for scientist: OpenCV 4
↑サイト様を参考に
boundingRectでx,y,w,hを取得すると、↓画像のように取ってきましたので、
rectangleで左下の点と右上の点を引数に入れてやると矩形を書き込めるので(x,y),(x+w,y+h)と書くと出来る。
あとは四角の中に四角が一つだけのものは、リストから削除する条件式を書いてエンドです。
# -*- coding:utf-8 -*-
import cv2
import sys
import numpy as np
imgFile = sys.argv[1]
imga = cv2.imread(imgFile)
#ガウシアンフィルタ,ノイズ除去
img = cv2.GaussianBlur(imga, (5, 5), 0)
#cannyにより エッジか、そうでないかの二値画像になる。
kani = cv2.Canny(img, 0, 50, apertureSize=5)
kani = cv2.dilate(kani, None)
cv2.imshow("canny",kani)
cv2.waitKey()
#各輪郭countours 要素hierarchy
#RETR_LIST すべての輪郭を抽出
#CHAIN_APPROX_SIMPLE 水平・垂直・斜めの線分を圧縮したやつの端点
contours ,hierarchy = cv2.findContours(kani, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
squares =
for i in range(0,len(contours)):
#矩形の中と外の輪郭を取ってしまうため、外だけを取得
if i % 2 == 0:
continue
x,y,w,h = cv2.boundingRect(contours[i])
tmp = np.array([x,y,x,y+h,x+w,y+h,x+w,y])
tmp = tmp.reshape(4,1,2)
squares.append(tmp)
squares2 = squares[:]
an_squares =
count = []
for i1 in range(0,len(squares)):
#リストの中身全削除
del an_squares[:]
for j1 in range(0,len(squares)):
if squares[i1][0][0][0] < squares[j1][0][0][0] and squares[i1][1][0][1] > squares[j1][1][0][1] and squares[i1][2][0][0] > squares[j1][2][0][0] and squares[i1][3][0][1] < squares[j1][3][0][1]:
an_squares.append(j1)
if len(an_squares) == 1:
count.append(an_squares[0])
for c in range(len(count)-1,-1,-1):
#矩形の中が1個の物は削除
del squares2[count[c]]
for sq in range(0,len(squares2)):
cv2.rectangle(imga, (squares2[sq][1][0][0],squares2[sq][1][0][1]), (squares2[sq][3][0][0],squares2[sq][3][0][1]), (255, 0, 0), 1)
cv2.imshow("www",imga)
cv2.waitKey()
import cv2
import sys
import numpy as np
imgFile = sys.argv[1]
imga = cv2.imread(imgFile)
#ガウシアンフィルタ,ノイズ除去
img = cv2.GaussianBlur(imga, (5, 5), 0)
#cannyにより エッジか、そうでないかの二値画像になる。
kani = cv2.Canny(img, 0, 50, apertureSize=5)
kani = cv2.dilate(kani, None)
cv2.imshow("canny",kani)
cv2.waitKey()
#各輪郭countours 要素hierarchy
#RETR_LIST すべての輪郭を抽出
#CHAIN_APPROX_SIMPLE 水平・垂直・斜めの線分を圧縮したやつの端点
contours ,hierarchy = cv2.findContours(kani, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
squares =
for i in range(0,len(contours)):
#矩形の中と外の輪郭を取ってしまうため、外だけを取得
if i % 2 == 0:
continue
x,y,w,h = cv2.boundingRect(contours[i])
tmp = np.array([x,y,x,y+h,x+w,y+h,x+w,y])
tmp = tmp.reshape(4,1,2)
squares.append(tmp)
squares2 = squares[:]
an_squares =
count = []
for i1 in range(0,len(squares)):
#リストの中身全削除
del an_squares[:]
for j1 in range(0,len(squares)):
if squares[i1][0][0][0] < squares[j1][0][0][0] and squares[i1][1][0][1] > squares[j1][1][0][1] and squares[i1][2][0][0] > squares[j1][2][0][0] and squares[i1][3][0][1] < squares[j1][3][0][1]:
an_squares.append(j1)
if len(an_squares) == 1:
count.append(an_squares[0])
for c in range(len(count)-1,-1,-1):
#矩形の中が1個の物は削除
del squares2[count[c]]
for sq in range(0,len(squares2)):
cv2.rectangle(imga, (squares2[sq][1][0][0],squares2[sq][1][0][1]), (squares2[sq][3][0][0],squares2[sq][3][0][1]), (255, 0, 0), 1)
cv2.imshow("www",imga)
cv2.waitKey()