🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

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

Python

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

Q&A

2回答

3965閲覧

OpenCVで特定の座標を含む領域を取得したい

shushubox

総合スコア12

OpenCV

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

Python

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

0グッド

0クリップ

投稿2021/03/17 04:33

編集2021/03/17 06:47

前提・実現したいこと

OpenCV-python を使って入力した画像のマスクを作成する関数を作っています。具体的には左下のような複数の物体が写った画像を入力した際に特定の物体の領域だけを白、それ以外の部分を黒にした右下のようなマスクを出力するようなものです。領域抽出をしたい物体は基本的に最も大きいため、現在のソースコードでは最大の領域を白、それ以外を黒にするようにしていますが、このコードだと画像によっては別の物体の領域が抽出されたり、背景の領域のほうが大きな領域だと認識され、右下のマスクの白と黒を反転させたようなものが出力されたりしてしまいます。
マスクイメージ図
そこで、領域抽出したい物体は必ず画像の中央の座標を含んでいるということはわかっているので、中央の座標を含んだ領域を白とし、それ以外を黒とするようなコードに変えたいと思っています。それを実現するためにはどのようにコードを変更すればいいでしょうか?
前提として、pytorch のプログラム中での関数で、関数の引数のimageは(batch size, channel, row, col)の4次元のtorch.tensorとなっています。自分のコードで入力する image の shape は (1,2,256,256) です。batch size は1なのでbatch size でのループはありません。また、仮に thresh がすべて0などの配列だった場合などのためにエラー処理としてすべて1で埋めた配列を渡すようにしています。

該当のソースコード

python

1 2def create_mask(image): 3 """Function to create mask 4 Args: 5 image: Input image as torch tensor. Shape must be (batch size, channel, row, col) 6 Returns: 7 Torch tensor of mask image with shape (batch size, channel, row, col) 8 """ 9 10 image = image.cpu().detach().numpy() 11 mask_list = [] 12 13 for c in range(image.shape[1]): 14 slc = image[0][c].astype(np.uint8) 15 thresh = cv2.threshold(slc, 0, 255, cv2.THRESH_OTSU)[1] 16 if not thresh.any(): 17 thresh = np.ones_like(thresh) # black image if thresh is all zero 18 # extract contours 19 contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0] 20 # pick the contour that has the largest area 21 max_cnt = max(contours, key=lambda x: cv2.contourArea(x)) 22 # create the mask of the largest area filling with white 23 black = np.zeros_like(slc) 24 mask = cv2.drawContours(black, max_cnt, -1, color=255, thickness=-1) 25 cv2.fillPoly(mask, pts =[max_cnt], color=255) 26 mask = torch.from_numpy(mask).float() 27 mask_list.append(mask) 28 mask = torch.stack(mask_list) 29 return mask.unsqueeze(0)

###使用環境・ライブラリのバージョン
Ubuntu 20.04.2 LTS
OpenCV: 4.5.1
pyTorch: 1.7.1
numPy: 1.18.1

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

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

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

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

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

yuki23

2021/03/17 04:53

質問は何でしょうか?
shushubox

2021/03/17 06:48

わかりにくい書き方をしていました.質問は中央の座標を含んだ領域のマスクを作成するにはソースコードをどのように変更すればよいか,です.
guest

回答2

0

cv.pointPolygonTestを使えば,所望のcontourを特定できるのではないでしょうか.

投稿2021/03/17 08:14

fana

総合スコア11985

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

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

0

contoursが枠なので、その中に座標が含まれるか否かを確認すれば良いと思います。

投稿2021/03/17 07:44

t_obara

総合スコア5488

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問