前提・実現したいこと
複数ある丸い点の最外周を認識し、矩形を描写したい。
矩形は点の最外周をとりたく、イメージとしては①、②、③、④の点がそれぞれXYの最大、最小値となる。
その時、XY最小、最大座標を利用し矩形を描写。
また、点の配列は回転方向にズレる場合も考慮し、cv2.minAreaRectによる外接矩形を利用したいと考えております。
すでに回答いただいている方もいらっしゃいますが、ありがとうございます。
大変勉強になります。
質問内容が分かりにくかったため、上記内容に修正します。
発生している問題・エラーメッセージ
下記コードで動かすと特定の1つの丸に対して矩形を描写してしまう。 複数ある場合の最外周を取る方法が不明 すみませんが、ご教授ください。
該当のソースコード
Python
1import cv2 2import tkinter as tk 3from tkinter import filedialog 4import numpy as np 5 6# 画像を読み込む 7idir = r'C:\\descktop' 8filetype = [("すべて", "*")] 9filepath = tk.filedialog.askopenfilename(filetypes=filetype, initialdir=idir) 10frame = cv2.imread(filepath) 11 12# 画像をグレースケール化 13gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 14 15# 画像を二値化 16ret, bin = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 17 18# モーメント関数で3次までのモーメントを取得 19mu = cv2.moments(bin) 20 21# 図心を出す 22x, y = int(mu["m10"]/mu["m00"]), int(mu["m01"]/mu["m00"]) 23 24# 図心を画像に記載する 25cv2.circle(frame, (x, y), 5, (0, 0, 255), 3) 26 27# 輪郭抽出 28contours, hierarchy = cv2.findContours(bin, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 29 30# s最外周に外接矩形を作成し、画像に重ね書き 31rect = cv2.minAreaRect(contours[0]) 32box = cv2.boxPoints(rect) 33box = np.int0(box) 34cv2.drawContours(frame, [box], 0, (0, 255, 0), 2) 35 36# 画像の情報を取得 37h, w, channels = frame.shape[:3] 38print("width: " + str(w)) 39print("height: " + str(h)) 40img = cv2.resize(frame, (int(w / 2), int(h / 2))) # 1/2に縮小 41 42 43 44# 画像を表示する 45cv2.imshow('frame', img) 46#cv2.imwrite('frame_moment.jpg',frame) 47 48# キー入力を待つ 49cv2.waitKey(0) 50 51# 全ての開いたウインドウ閉じる 52cv2.destroyAllWindows()
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
wWindows10
Python3.6

回答2件
あなたの回答
tips
プレビュー