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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

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

Q&A

解決済

1回答

1960閲覧

配列の値が(nan,inf)の場合はcontinueで飛ばしたい

kodai0505

総合スコア8

OpenCV

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

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

0グッド

1クリップ

投稿2021/11/05 01:28

編集2021/11/05 02:02

#背景
現在、ベルトコンベヤーで流れてくる椎茸の大きさ判定を行っています。
外接円や外接矩形による椎茸の検出は上手くいくのですが、楕円による検出が上手くいきません。

#問題点
配列ellipse[0]の値が(nan, inf)の時にcontinueで飛ばしたいのですが、以下のようなコードを書いて実行しても飛ばされませんでした。
大まかな内容だとcv2.fitEllipse関数によって椎茸を楕円で検出を行っているのですが、椎茸が検出される前の何も映っていない状況だと以下のようなエラーが返され、検出を続行することが出来ませんでした。そのため何も映っていない状態であればcontinueで飛ばしたいと思いました。

python

1if ellipse[0] == ("nan", "inf"): 2continue

#エラー内容

python

1Traceback (most recent call last): 2 File "iro3_ellipse.py", line 72, in <module> 3 frame = cv2.ellipse(frame,ellipse,(255,0,0),2) 4cv2.error: OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-u4kjpz2z\opencv\modules\imgproc\src\drawing.cpp:1947: error: (-215:Assertion failed) box.size.width >= 0 && box.size.height >= 0 && thickness <= MAX_THICKNESS in function 'cv::ellipse'

#プログラム

python

1#楕円 2import cv2 3import numpy as np 4from PIL import Image, ImageFont, ImageDraw 5import os 6 7dir = 'movie' # 動画が保存されているディレクトリ 8path = '3-5.MOV' # ファイル名 9 10# 画像に文字を入れる関数 11def telop(img, message,W,H): 12 font_path = 'C:\Windows\Fonts\meiryo.ttc' # Windowsのフォントファイルへのパス 13 font_size = 100 # フォントサイズ 14 font = ImageFont.truetype(font_path, font_size) # PILでフォントを定義 15 img = Image.fromarray(img) # cv2(NumPy)型の画像をPIL型に変換 16 draw = ImageDraw.Draw(img) # 描画用のDraw関数を用意 17 18 w, h = draw.textsize(message, font) # .textsizeで文字列のピクセルサイズを取得 19 20 # テロップの位置positionは画像サイズと文字サイズから決定する 21 # 横幅中央、縦は下 22 position = (int((W - w) / 2), int(H - (font_size * 1.5))) 23 24 # 中央揃え 25 #position = (int((W - w) / 2), int((H - h) / 2)) 26 27 # テキストを描画(位置、文章、フォント、文字色(BGR+α)を指定) 28 draw.text(position, message, font=font, fill=(0, 0, 255, 0)) 29 30 # PIL型の画像をcv2(NumPy)型に変換 31 img = np.array(img) 32 return img 33 34in_path = os.path.join(*[dir, path]) # 読み込みパスを作成 35cap = cv2.VideoCapture(in_path) 36#cap = cv2.VideoCapture(0) 37Fs = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 動画の全フレーム数を計算 38fps = cap.get(cv2.CAP_PROP_FPS) # 動画のFPS(フレームレート:フレーム毎秒)を取得 39W = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 動画の横幅を取得 40H = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 動画の縦幅を取得 41#fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') # 動画保存時のfourcc設定(mp4用) 42 43while True: 44 cv2.namedWindow("img", cv2.WINDOW_NORMAL) 45 cv2.resizeWindow("img", 640, 480) 46 ret, frame = cap.read() 47 if ret == False: 48 break 49 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 50 lower = np.array([10, 50, 0]) 51 upper = np.array([75, 255, 255]) 52 binary = cv2.inRange(hsv, lower, upper) 53 #dst = cv2.bitwise_and(frame, frame, mask = frame_mask) 54 # 輪郭抽出 55 contours, hierarchy = cv2.findContours( 56 binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE 57 ) 58 59 if len(contours) == 0: 60 continue 61 62 # 小さい輪郭は無視する 63 max_contour = max(contours, key=lambda x: cv2.contourArea(x)) 64 65 # 外接矩形を描画する 66 #x, y, w, h = cv2.boundingRect(max_contour) 67 #area = round(int(cv2.contourArea(max_contour)),-4) 68 #cv2.rectangle(frame, (x, y), (x + w, y + h), color=(255, 0, 0), thickness=3) 69 ellipse = cv2.fitEllipse(max_contour) 70 print(ellipse[0]) 71 if ellipse[0] == ("nan", "inf"): 72 continue 73 frame = cv2.ellipse(frame,ellipse,(255,0,0),2) 74 75 w,h = ellipse[1] 76 77 w,h = int(w),int(h) 78 79 message = '幅:' + str(w) + '高さ:' + str(h) 80 frame = telop(frame, message, W, H) 81 82 cv2.imshow("img", frame) 83 #print(w,h) #コマンドプロンプトでピクセル表示 84 if cv2.waitKey(10) == 27: #ESCキーで切る 85 break 86cv2.destrayAllWindows()

素人質問で申し訳ございませんが、ご教授いただけると幸いです。

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

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

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

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

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

1T2R3M4

2021/11/05 01:33

提示のコードを動作させてみましたか。
kodai0505

2021/11/05 01:56

実際にコードを実行したのですが出来ませんでした。
1T2R3M4

2021/11/05 02:00

エラー出ませんでしたか。
kodai0505

2021/11/05 02:04

質問にエラー内容を加えさせて頂きました。 確認のほどよろしくお願いいたします。
guest

回答1

0

ベストアンサー

naninf は文字列ではなく、numpy で定義されている float 型の定数なのです。

numpy.nan
numpy.inf

なので、以下の様に書くとよろしいかと思います。

python

1 if ellipse[0] in (np.nan, np.inf): 2 continue

投稿2021/11/05 02:40

編集2021/11/05 02:41
melian

総合スコア19714

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

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

kodai0505

2021/11/05 04:45

cv2.fitEllipseでフィッティングした後に提案していただいたコードを入力していただいたのですが同じようなエラーが返されました。追加で修正点を教えていただけると幸いです。 ellipse = cv2.fitEllipse(max_contour) print(ellipse[0]) if ellipse[0] in (np.nan, np.inf): continue
melian

2021/11/05 04:59

確認しておきたいのですが、 if ellipse[0] in (np.nan, np.inf): continue に書き換えることで何も映っていないデータをスキップすることができたのでしょうか?
kodai0505

2021/11/05 05:12

はい、そうです。 frame = cv2.ellipse(frame,ellipse,(255,0,0),2)でエラー出ているので、その前でcontinueで飛ばしたいと思いました。
melian

2021/11/05 05:14

いえ、その様な意味で言ったのではなく、実際にスキップされていますか?ということです。
kodai0505

2021/11/05 06:13 編集

continueの後にprint('a')を入れたのですが表示されていたのでスキップされていませんでした。
kodai0505

2021/11/05 06:15

〇プログラム内容 ellipse = cv2.fitEllipse(max_contour) print(ellipse[0]) if ellipse[0] in (np.nan, np.inf): continue print('a') frame = cv2.ellipse(frame,ellipse,(255,0,0),2) 〇エラー文 ... a (1431.3341064453125, 143.5667266845703) a (1447.2572021484375, 175.51828002929688) a (nan, inf) a Traceback (most recent call last):
melian

2021/11/05 06:26

ellipse[0] の内容は (nan, inf) という tuple になるのですね。。。もしかしたら ellipse[0] の値が (np.inf, np.nan) などになる可能性もあるかもしれませんので、 if any(i in (np.nan, np.inf) for i in ellipse[0]): continue としてみてください。
kodai0505

2021/11/08 06:42

cv2.ellipseのコードでエラーが消えたのですが、その前のコードのcv2.fitEllipseでエラーが返されました。 〇エラー内容 ellipse = cv2.fitEllipse(max_contour) cv2.error: OpenCV(4.5.4-dev) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\shapedescr.cpp:360: error: (-201:Incorrect size of input array) There should be at least 5 points to fit the ellipse in function 'cv::fitEllipseNoDirect' なので以下のようなプログラムでmax_countourが存在しないときにcontinueで飛ばすようにしたのですができませんでした。 max_contour = max(contours, key=lambda x: cv2.contourArea(x)) if len(max_contour) == 0: continue ellipse = cv2.fitEllipse(max_contour)
kodai0505

2021/11/08 06:44

max_contourは以下のような配列になっています。 ... [[[1505 1076]] [[1505 1077]] [[1506 1077]] [[1506 1076]]]
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問