前提・実現したいこと
OpenCVを利用して、物体検知を行いたいです。
「学習済みモデル」を使わず、自力で検出を行う為、「物体を認識」、「輪郭を検出」させたい。
ここに質問の内容を詳しく書いてください。
Google Colab上に写真をアップし、以下コードを実行したところ、cv::UMat型である必要があるとのエラーが出ます。
どのように対応すればよいかわからず困っています。
発生している問題・エラーメッセージ
エラーメッセージ TypeError Traceback (most recent call last) <ipython-input-6-3d01ddb11687> in <module>() 34 #検出した輪郭を近似して最適化。 35 for c in contours: ---> 36 epsilon = 0.001 * cv2.arcLength(c, True) 37 approx = cv2.approxPolyDP(c, epsilon, True) TypeError: Expected Ptr<cv::UMat> for argument '%s' ### 該当のソースコード import cv2 import numpy as np birds = cv2.imread('birds.jpg') #鳥の輪郭抽出用 contoured = cv2.imread('birds.jpg') #元画像と鳥の輪郭を抽出した結果を合成するために用意 def binary_threshold_for_birds(img): grayed = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #画像の2値化 under_thresh = 114 #この値より明るい画素(背景)を白にするパラメータ upper_thresh = 150 #この値より明るい画素を黒で強調する(輪郭強調の)パラメータ maxValue = 255 th, drop_back = cv2.threshold(grayed, under_thresh, maxValue, cv2.THRESH_BINARY) th, clarify_born = cv2.threshold(grayed, upper_thresh, maxValue, cv2.THRESH_BINARY_INV) merged = np.minimum(drop_back, clarify_born) morphed = morph_and_blur(merged) return morphed #画像を平滑化する関数 def morph_and_blur(img): kernel = np.ones((3, 3),np.uint8) m = cv2.GaussianBlur(img, (3, 3), 0) m = cv2.morphologyEx(m, cv2.MORPH_OPEN, kernel, iterations=2) m = cv2.GaussianBlur(m, (5, 5), 0) return m birds = binary_threshold_for_birds(birds) #前処理を行った後の画像birdsから輪郭を検出。 #「RETR_EXTERNAL」は最も外側の輪郭を採用。「CHAIN_APPROX_SIMPLE」は、輪郭を圧縮して冗長な点の情報を削除し、コンピュータのメモリを削減。 contours = cv2.findContours(birds, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) #検出した輪郭を近似して最適化。 for c in contours: epsilon = 0.001 * cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, epsilon, True) ```ここに言語名を入力 ソースコード
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
Google Colaboratory
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/21 14:58