何度も同じような質問をしてしまい、申し訳ありません。
以下のコードで画像から赤色を認識して枠で囲んでウィンドウに表示させるということを行っているのですが、目的の色と違うものが認識されてしまうことがあります。そしてその認識された部分のRGBをネットのツールで調べて計算してHSV変換したのですが、設定したHSV(Vは未設定)と違う値でした。ということは設定したHSVの範囲外のものを認識してしまっているということになるのですが、改善する方法はないでしょうか。
・追記
もしかしてHSVの指定方法が間違っているのでしょうか。
誤認識したHSVのSは設定の範囲内で、もしかしたら[(h > 240) & ((100 < s) & (s < 200))] はhが240以上または、sが100〜200までなら認識してしまうということなのでしょうか。でもそれだと壁一面を認識してもおかしくないとも思って結局よくわからないので教えていただきたいです。
また、他の人(このときは誤認識した赤色のHSVが設定したHSVの範囲から外れているとは言っていない)から「if文を使って指定した赤色を認識した場合、赤枠を表示するといいのでは」と言われましたが、これでは、どのみち誤認識は変わらないのではないかと思ってしまいました。実際この方法で誤認識は減らせるのでしょうか。
import cv2 import numpy as np def find_rect_of_target_color(image): hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL) h = hsv[:, :, 0] s = hsv[:, :, 1] v = hsv[:, :, 1] mask = np.zeros(h.shape, dtype=np.uint8) mask[(h > 240) & ((100 < s) & (s < 200))] = 255 mask, contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) rects = [] for contour in contours: approx = cv2.convexHull(contour) rect = cv2.boundingRect(approx) rects.append(np.array(rect)) return rects img = cv2.imread('/home/pi/picture/alarm7-2.png') rects = find_rect_of_target_color(img) if len(rects) > 0: rect = max(rects, key=(lambda x: x[2] * x[3])) cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (0, 0, 255), thickness=2) cv2.imshow("red", img) cv2.waitKey(0) cv2.destroyAllWindows()
回答2件
あなたの回答
tips
プレビュー