質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1626閲覧

PythonでOpenCVを用いて面積を求めたいです。

ponpon0987

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/09/18 18:24

前提・実現したいこと

私は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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

円形である硬貨の外接矩径を描いているため、硬貨の幅と高さのピクセルが同じにならないとおかしいのですが、なぜピクセルが縦と横で異なる数値がでるのか原因がわかりません。

硬貨幅 : 487(px)
硬貨高さ : 473(px)

まず厳密に真上から撮影したものでない場合 (少しでも斜めになっていたりすると)、円形のものでも画像上では円形にはなりません。
また、抽出された輪郭は2値化や輪郭抽出の良し悪しに依存します。

以上を踏まえると、画像の画素数はわかりませんが、この程度の差であれば誤差の範囲内ではないかと思います。
画像処理なので厳密に硬貨幅 == 硬貨高さとなることは基本的にないと思います。

カメラの設置位置、角度や2値化のパラメータの調整で改善する可能性はあります。

投稿2019/09/18 18:47

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問