LoginSignup
0

More than 1 year has passed since last update.

Pythonでエラー:error: (-5:Bad argument) in function 'inRange'

Posted at

前提

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_funcmssでキャプチャした画像をそのまま入れていたことが原因でした。cv2mssと違い、配列に変換してから処理するようです。参考文献を見て、img_bw_funcを修正しました。

参考文献は以下に示すので、見に行って、どうぞ(投げやり)。

参考文献

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0