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

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

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

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

Python

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

Q&A

解決済

1回答

2109閲覧

動画像処理で楕円による大きさ判定でエラー

kodai0505

総合スコア8

OpenCV

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

Python

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

0グッド

0クリップ

投稿2021/11/04 03:51

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

#問題点
cv2.fitEllipse関数によって椎茸を楕円で検出を行っているのですが、椎茸が検出される前の何も映っていない状況だと以下のようなエラーが返され、検出を続行することが出来ませんでした。ご教授いただけると幸いです。

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 frame = cv2.ellipse(frame,ellipse,(255,0,0),2) 71 72 w,h = ellipse[1] 73 74 w,h = int(w),int(h) 75 76 message = '幅:' + str(w) + '高さ:' + str(h) 77 frame = telop(frame, message, W, H) 78 79 cv2.imshow("img", frame) 80 #print(w,h) #コマンドプロンプトでピクセル表示 81 if cv2.waitKey(10) == 27: #ESCキーで切る 82 break 83cv2.destrayAllWindows()

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

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

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

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

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

guest

回答1

0

ベストアンサー

ellipse = cv2.fitEllipse(max_contour)

の結果たる ellipse の内容をチェックし,まともなデータでない場合には以降の ellipse を用いた処理を行わないようにすればよいのではないでしょうか.


関係ないですが,気になった点として……

前段で CHAIN_APPROX_SIMPLE を使っていることが,後段の楕円フィッティング結果に影響を及ぼすと思われるので,そういった点についても確認した方がよいかもしれませんね.

投稿2021/11/04 04:09

編集2021/11/04 04:13
fana

総合スコア11996

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

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

kodai0505

2021/11/04 06:07

ellipse[0]の値が ... (1425.598876953125, 552.8565673828125) (1431.3341064453125, 143.5667266845703) (1447.2572021484375, 175.51828002929688) (nan, inf) となっていたので ellipse = cv2.fitEllipse(max_contour) print(ellipse[0]) if ellipse[0] == ("nan", "inf"): continue frame = cv2.ellipse(frame,ellipse,(255,0,0),2) と変えたのですが同じようなエラーが出力され、出来ませんでした。 どのように変えればよいのか教えていただけると幸いです。
fana

2021/11/04 06:13

私は方針を述べましたが, pythonにおける具体的な実装を答えることはできません(その言語を知らないため). 具体コードでの回答が必要である場合には,それを示すことができる他者からの回答を待ってください. #そのコメントの内容を質問文の末尾に追記し,判定の具体的な実装方法がわからない旨を明記すれば,話をそういう方向に向かわせることができるのではないでしょうか.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問