#背景
現在、ベルトコンベヤーで流れてくる椎茸の大きさ判定を行っています。
外接円や外接矩形による椎茸の検出は上手くいくのですが、楕円による検出が上手くいきません。
#問題点
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()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/04 06:07
2021/11/04 06:13