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

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

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

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1006閲覧

画像処理<Python>

hinata0812

総合スコア14

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/08/22 06:19

Pythonを学習している初学者です。
足の輪郭を取得したいのですが、どのようにすれば取得できますでしょうか?
ご教示いただけると幸いです。

import cv2 import numpy as np Img = cv2.imread("*******", 1) A4Height,A4Width=29.7,21 height = Img.shape[0] width = Img.shape[1] img1 = cv2.resize(Img , (int(width*0.5), int(height*0.5))) shapeHih,shapeWid=img1.shape[0],img1.shape[1] print(shapeHih,shapeWid) gray = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)#cv2.COLOR_RGB2GRAY cv2.COLOR_BGR2GRAY img_h=cv2.GaussianBlur(gray, (19, 9), 31) threshold = 100 # 二値化(閾値100を超えた画素を255にする。) dd,thresh = cv2.threshold(img_h,110,250 , cv2.THRESH_BINARY) coytu,cnts = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#cv2.RETR_LIST cv2.RETR_EXTERNAL # 二値化画像の表示 for i in range(0,len(coytu)): if len(coytu[i])>0: if cv2.contourArea(coytu[i]) < 1: continue #eがx座標#fがy座標 gがx座標 hがy座標 rect = coytu[i] e,f,g,h = cv2.boundingRect(rect) #画像 #左上タプル # 右下タプル #色を指定 rect=cv2.rectangle(img1,(e,f),(e+g,f+h),(0,0,255),2) print("e",e,"f",f,"g",g,"h",h) dd=cv2.line(img1,(e,h),(g,h),(0, 255, 0), thickness=2,lineType=cv2.LINE_AA)#640→をgに変更したら e 40 f 0 g 599 h 372 #dd=cv2.line(img1,(40,372),(599,372),(0, 255, 0), thickness=2,lineType=cv2.LINE_AA)#640→をgに変更したら e 40 f 0 g 599 h 372 aca=np.array([e,h]) bcb=np.array([g,h]) df=aca- bcb print(np.linalg.norm(df)*A4Width/shapeWid) cv2.imshow('img1',img1) cv2.waitKey() cv2.destroyAllWindows()

出力結果
イメージ説明

取得したい輪郭
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

■画像処理的な手法
一番はじめに検討したい手法は、カラースケールをHSVにして、「足っぽい色」だけを抽出した後に、二値化してそこから矩形を検出する方法です。

1)HSV
HSVにするメリットは、「クリーム色に近い部分だけ」のような色味の指定が簡単にできるためです。グレースケールやRGBだとこれは非常に難しいですが、HSVであれば直感に沿って色の指定ができます。
OpenCVのチュートリアルが参考になります。

2)矩形抽出
既に二値化できるところまで来ているようですので、矩形の検出は既定の関数ですぐにできます。四角の描画も線を一本一本引かなくてもまとめて引けます。だいぶ楽になるのではないでしょうか?こちらも別のOpenCVのチュートリアルが参考になります。


漂う力技感。
test.png
img_drawn.png

Python3

1import cv2 2 3def detect_contour(img): 4 int_ocv = int(cv2.__version__[0]) 5 if int_ocv == 4: 6 contours, hierachy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 7 else: 8 _, contours, hierachy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) 9 return contours 10 11 12img_raw = cv2.imread("test.png") 13img_drawn = img_raw.copy() 14img_hsv = cv2.cvtColor(img_raw,cv2.COLOR_BGR2HSV) 15 16img_bin = cv2.inRange(img_hsv, (0,20,0), (10,255,255)) 17 18# cv2.imshow("img_bin",img_bin) 19 20### 21 22contours = detect_contour(img_bin) 23for cnt in contours: 24 area = cv2.contourArea(cnt) 25 if area > 2000: 26 img_bin = cv2.drawContours(img_bin,[cnt],-1,(128), -1) 27img_bin[img_bin==255] = 0 28img_drawn[img_bin==128] = (0,0,255) 29 30### 31contours = detect_contour(img_bin) 32for cnt in contours: 33 # area = cv2.contourArea(cnt) 34 x, y, w, h = cv2.boundingRect(cnt) 35 img_drawn = cv2.rectangle(img_drawn,(x,y),(x+w,y+h),(0,255,0),2) 36 37# cv2.imshow("img_raw",img_raw) 38# cv2.imshow("img_bin[fixed]",img_bin) 39cv2.imshow("img_drawn",img_drawn) 40cv2.waitKey(0) 41cv2.imwrite("img_drawn.png",img_drawn) 42 43 44 45 46 47 48cv2.waitKey(0) 49

さらに精度が必要であれば機械学習深層学習を検討ください。

投稿2021/08/23 22:09

編集2021/08/24 21:28
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fana

2021/08/24 05:37

提示されている画像を見るに,壁はまだしも,床は肌色(※)な感じ. 色味から足と背景を分離することは難しそうに思えますがどうなんでしょう? (※)この画像における足の領域の色味を指す語として「肌色」を用いた.何かしらの差別的に意図はない.
退会済みユーザー

退会済みユーザー

2021/08/24 21:34

背景の色と足の色と近いので画像的にあまり「筋が良い」感じがしないですよね…。これだけ近いと背景画像と足の画像の差分を見た方が手っ取り早そうです。無理やりinrangeを使うのであれば「血色のよさそうな部分」を拾う、になりそうです。 --- YOLO(https://github.com/AlexeyAB)であれば「腕だろうが手だろうが顔だろうがとりあえずは"人間"」と判定をしてくれるので、人間の一部を検出したい、であればYOLOが良いと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問