

Pythonで下記のOpencvのプログラムを書いたところ

[code]

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    th = 100
    
    # 背景, 入力画像の取得
    im_bg = cv2.imread('kyousitu2.jpeg')
    im_in = cv2.imread('kyousitu1.jpeg')
    # 差分計算
    diff = cv2.absdiff(im_in,im_bg)
    # 差分が閾値より小さければTrue
    mask = diff < th
    # 配列（画像）の高さ・幅
    hight = im_bg.shape[0]
    width = im_bg.shape[1]
    #resize_img = cv2.resize(img_dst,(hight/2,width/2))
    
    # 背景画像と同じサイズの配列生成
    im_mask = np.zeros((hight,width),np.uint8)
    # Trueの部分（背景）は白塗り
    im_mask[mask] = 255
    # ゴマ塩ノイズ除去
    im_mask = cv2.medianBlur(im_mask,blur)
    # エッジ検出
    im_edge = cv2.Canny(im_mask,100,200)
    
    cv2.imshow("detected2.jpg", im_mask)
    
[/code]

下記のようなエラーが出ました。

[code]

    Traceback (most recent call last):
    File "sabun7.py", line 22, in <module>
    im_mask[mask] = 255
    IndexError: too many indices for array
    
[/code]

これはどういう意味なのでしょうか。またどうすれば直るのでしょうか。


CC BY-SA 3.0
2016-12-28T07:38:58.687
31489
2016-12-31T11:06:35.657
2016-12-31T11:06:35.657
3054
20022
question
python opencv numpy
numpy 配列の要素への操作で IndexError: too many indices for array が発生する


`im_mask`の`shape`は`(height,width)`ですが`mask`の`shape`はRGB画像であれば`(height,width,3)`となるので`shape`があっていないというエラーです。`im_mask`にチャンネル次元をもつように修正します。例えば以下のような感じです

[code]

    hight = im_bg.shape[0]
    width = im_bg.shape[1]
    channel = im_bg.shape[2]
    
    # 背景画像と同じサイズの配列生成
    im_mask = np.zeros((hight, width, channel), np.uint8)
    
[/code]


CC BY-SA 3.0
2016-12-29T14:14:03.217
31532
2016-12-29T16:17:56.683
2016-12-29T16:17:56.683
14418
14418
31489
answer