OpenCV + Pythonで特定の図形を検出する
OpenCV + Pythonで特定の図形を検出する1(図形の領域を矩形で取得)
確かにここの輪郭を検出しているようだ。
確かにここの輪郭を検出しているようだ。
import cv2 as cv def main(): # ファイルを読み込み image_file = 'debug_1.png' src = cv.imread(image_file, cv.IMREAD_COLOR) # 画像の大きさ取得 height, width, channels = src.shape image_size = height * width # グレースケール化 img_gray = cv.cvtColor(src, cv.COLOR_RGB2GRAY) # しきい値指定によるフィルタリング retval, dst = cv.threshold(img_gray, 127, 255, cv.THRESH_TOZERO_INV ) # 白黒の反転 dst = cv.bitwise_not(dst) # 再度フィルタリング retval, dst = cv.threshold(dst, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) # 輪郭を抽出 #dst, contours, hierarchy = cv.findContours(dst, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) contours, hierarchy = cv.findContours(dst, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) # この時点での状態をデバッグ出力 dst = cv.imread(image_file, cv.IMREAD_COLOR) dst = cv.drawContours(dst, contours, -1, (0, 0, 255, 255), 2, cv.LINE_AA) cv.imwrite('debug_1.png', dst) dst = cv.imread(image_file, cv.IMREAD_COLOR) for i, contour in enumerate(contours): img = cv.drawContours(src, contours, i, (0,255,0), 3) cv.imshow("out"+str(i), img) cv.waitKey(0) # 小さな領域の場合は間引く area = cv.contourArea(contour) if area < 500: continue # 画像全体を占める領域は除外する if image_size * 0.99 < area: continue # 外接矩形を取得 x,y,w,h = cv.boundingRect(contour) dst = cv.rectangle(dst,(x,y),(x+w,y+h),(0,255,0),2) # 結果を保存 cv.imwrite('result.png', dst) cv.destroyAllWindows() if __name__ == '__main__': main()
コメント
コメントを投稿