opencvを用いた画像処理を行っています。
内容は、赤色だけを囲う(バウンディングボックス)の様なものを作りたいです。
現在、物体を囲うことはできているのですが、赤色だけでなく青色やその他の色も囲ってしまいます。
11行目〜12行目(以下)の
**lower_red = np.array([33, 68, 33])
upper_red = np.array([2, 230, 250])**
BGRパラメーターの調整がうまくいきません。
赤色だけを縁取る(囲う)にはどんなパラメーターがベストなのでしょうか?
また修正すべき箇所があればご教授下さい。
もしよろしければ教えて頂きたいです。
import cv2
import numpy as np
# カメラの読み込み
cap = cv2.VideoCapture(0)
print(cap.isOpened())
while True:
_, frame = cap.read()
blurred_flame = cv2.GaussianBlur(frame, (5, 5), 0)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_red = np.array([33, 68, 33])
upper_red = np.array([2, 230, 250])
mask = cv2.inRange(hsv, lower_red, upper_red)
_, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for contour in contours:
area = cv2.contourArea(contour)
# ノイズの値を調べる
# print(area)
# ノイズの処理
if area > 500:
cv2.drawContours(frame, contour, -1, (0, 255, 0), 3)
cv2.imshow("Frame", frame)
cv2.imshow("Mask", mask)
key = cv2.waitKey(1)
if key == 27:
break
cap.release()
cv2.destroyALLwindows()
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
HSV 変換したものに対して、lower=(20, 0, 0), upper=(50, 255, 255) で2値化したあと、面積が 10000 以上の輪郭だけ残したところ、犬だけ抽出できました。
パラメータの決めの問題なので、うまくいかない場合は値を調整してください。
import cv2
# 画像を読み込む。
img = cv2.imread("sample.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
binary = cv2.inRange(hsv, (20, 0, 0), (50, 255, 255))
# 輪郭抽出
# OpenCV3 の場合は以下
# contours = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[1]
contours = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[0]
# 面積が一定以上の輪郭のみ残す。
area_thresh = 10000
contours = list(filter(lambda x: cv2.contourArea(x) > area_thresh, contours))
# 輪郭を矩形で囲む。
for cnt in contours:
# 輪郭に外接する長方形を取得する。
x, y, width, height = cv2.boundingRect(cnt)
# 描画する。
cv2.rectangle(img, (x, y), (x + width, y + height), color=(0, 255, 0), thickness=2)
cv2.imwrite("ret.png", img)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
tiitoi
2019/06/06 17:02
どのようなパラメータがよいかは画像によるので、実際の画像がないと回答はできないです。
rgb_nk
2019/06/06 17:10
内蔵カメラでキャプチャーしているため、行った画像ではないのですが、更新いたしました。赤外線画像の犬を最終的には囲いたいです。
また現在、内蔵カメラからの映像で赤色だけを囲って頂きたいです。
青色もマスク処理されているので、赤色だけが難しいです...
よろしくお願い致します。