前提・実現したいこと
私はPython を用いて面積を求めようと考えております。
方法としては、面積が既知数である物(定期券といったカード)を置き、求めたい面積を隣に並べます。
今回は求めたい面積を10円玉にしました。
上から撮影を行い、外接矩径の描画行なって、ピクセルを求めました。
その後、既知数の面積とピクセルの比から10円玉の面積を求めようとしております。
以下のソースコード実行すると、
カード幅 : 1757(px)
カード高さ : 1140(px)
硬貨幅 : 487(px)
硬貨高さ : 473(px)
が求まりました。
円形である硬貨の外接矩径を描いているため、硬貨の幅と高さのピクセルが同じにならないとおかしいのですが、なぜピクセルが縦と横で異なる数値がでるのか原因がわかりません。
どうぞ宜しくお願いいたします。
該当のソースコード
python
1from PIL import Image 2import cv2 3from datetime import datetime 4import matplotlib.pylab as plb 5import numpy as np 6import sys 7 8def main(): 9 img_org = cv2.imread('test1.jpg') 10 # グレースケール化 11 img_tmp = cv2.cvtColor(img_org, cv2.COLOR_BGR2GRAY) 12 img_tmp_preprocessed = cv2.GaussianBlur(img_tmp, (5, 5), 0) 13 14 # 2値化 15 # - cv2.findContours()は、黒と背景、白を物体として判定する為 16 # cv2.THRESH_BINARY_INV で 2値化し、ネガポジ反転 17 # - cv2.THRESH_BINARY は単なる2値化 18 ret, img_tmp = cv2.threshold(img_tmp_preprocessed, 19 128, # 閾値 20 256, # 画素値の最大値 21 cv2.THRESH_BINARY_INV) # 2値化type 22 23 time_str = datetime.now().strftime("%Y%m%d_%H%M%S") 24 tmp_file = 'tmp_' + time_str + '.png' 25 cv2.imwrite(tmp_file, img_tmp) 26 27 # 境界線探索 28 # - 第2引数: 29 # - cv2.RETR_EXTERNAL は最外周のみ探索 30 # - cv2.RETR_TREE は全境界を探索 31 # - 返り値: 32 # - contours : 探索された境界 33 # - hierarchy: 境界が複数ある場合の階層 34 contours, hierarchy = cv2.findContours(img_tmp, 35 cv2.RETR_EXTERNAL, 36 cv2.CHAIN_APPROX_SIMPLE) 37 38 # 境界の描画 ( img_org データに contours データをマージ ) 39 cv2.drawContours(img_org, contours, -1, (255,0,0), 10) 40 41 new_file = 'new_' + time_str + '.png' 42 cv2.imwrite(new_file, img_org) 43 44 for contour in contours: 45 x, y, w, h = cv2.boundingRect(contour) 46 cv2.rectangle(img_org, (x, y), (x + w, y + h), (0, 255, 0), 3) 47 #画像保存 48 new_file = 'new_' + time_str + '.png' 49 cv2.imwrite(new_file, img_org) 50 #x座標,y座標,高さ,幅の検出 51 print(x) 52 print(y) 53 print(w) 54 print(h) 55 56 57if __name__ == '__main__': 58 main()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。