前提
Pythonで画像編集処理を行っていた際にぶつかったエラーになります。非常に初歩的なものですが少し悩んでしまったので自分用に投稿。
エラー内容は下記。
python
OpenCV(4.6.0) :-1: error: (-5:Bad argument) in function 'inRange'
> Overload resolution failed:
> - src is not a numpy array, neither a scalar
> - Expected Ptr<cv::UMat> for argument 'src'
実現したいこと
cv2
モジュールのinRange
メソッドを用いて、読み込んだ画像を色で閾値を設けて処理したい。コードがこれ。
# 抽出関数を定義
def ext(img_bw_func, bgrt_obj_func) :
# 0以下、255以上の値が出ないように処理
minbgr = []
maxbgr = []
for i in range(0,3) :
minbgr.append(max(0, bgrt_obj_func[i] - bgrt_obj_func[3]))
maxbgr.append(min(255, bgrt_obj_func[i] + bgrt_obj_func[3]))
minBGR_func = np.array(minbgr)
maxBGR_func = np.array(maxbgr)
img_mod_func = cv2.inRange(img_bw_func, minBGR_func, maxBGR_func)
return img_mod_func
解決...?
inRange
メソッドでは第一引数に画像の多次元配列、第二引数に2値化するときの下限、第三引数に上限を記載する。第二引数、第三引数の書き方はリストではなく、cv2.inRange(img, (0, 0, 0), (255, 255, 3))
のように記述するべきであった。
numpyで実装した。
# 抽出関数を定義
def ext(img_bw_func, bgrt_obj_func) :
# 0以下、255以上の値が出ないように処理
minbgr = []
maxbgr = []
for i in range(0,3) :
minbgr.append(max(0, bgrt_obj_func[i] - bgrt_obj_func[3]))
maxbgr.append(min(255, bgrt_obj_func[i] + bgrt_obj_func[3]))
mymin = np.array(minbgr)
mymax = np.array(maxbgr)
img_mod_func = cv2.inRange(img_bw_func, mymin, mymax)
return img_mod_func
また、エラー!!&解決
これで実行ヨシ!ファッ?またエラーが出たゾ...。
よく見たら、img_bw_func
にmss
でキャプチャした画像をそのまま入れていたことが原因でした。cv2
はmss
と違い、配列に変換してから処理するようです。参考文献を見て、img_bw_func
を修正しました。
参考文献は以下に示すので、見に行って、どうぞ(投げやり)。
参考文献