OpenCVのチャンネルエラー対処: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function ‘binary_op’

OpenCVのチャンネルエラー対処: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function ‘binary_op’ OpenCV




概要

Python + OpenCVのスクリプトを書いていたところ、タイトルにあるようなエラーが出現しました。
結果的にはnumpyの配列のサイズが異なるのが原因だったようです。

詳細

下記のソースはPythonで読み込んだ画像にマスクをかける処理です。

import cv2
import numpy as np

if __name__ == "__main__" :
    im = cv2.imread('img/lenna.png')

    height = im.shape[0]
    width = im.shape[1]

    im = cv2.resize(im, (width, height))

    contours = np.array(
        [
            [50,0],
            [65,40],
            [100, 40],
            [75, 60],
            [100,100],
            [50,80],
        ]
    )

    mask = np.tile(np.uint8([0,0,0]), (width, height, 1))
    cv2.fillConvexPoly(mask, points =contours, color=(255, 255, 255))

    img_masked = cv2.bitwise_and(im, im, mask=mask )

    cv2.imshow('result', img_masked)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

これを実行した時のエラーがこちら、

Traceback (most recent call last):
  File "main4.py", line 46, in 
    img_masked = cv2.bitwise_and(im, im, mask=mask )
cv2.error: OpenCV(3.4.3) /tmp/opencv-20181001-41572-id0soo/opencv-3.4.3/modules/core/src/arithm.cpp:241: error: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function 'binary_op'

エラーコードから、チャンネル数の違いによりエラーが発生しているのではないかと推測しました。

そして色々試した結果、
結果的には、mask画像が3チャンネルになっていたことが原因だとわかりました。
CV_8UもしくはCV_8Sで渡す必要があるようです。

なのでmask作成の箇所を以下のように書き換え、無事解決することができました。

mask = np.tile(np.uint8(0), (width, height, 1))

Mat型一覧について

OpenCVのMatのタイプ一覧表
OpenCVのMatのタイプ一覧表
型一覧表Matタイプ詳細データの型CV_8U符号なしの8ビット整数unsigned charCV_8S符号付きの8ビット整数signed charCV_16U符号なしの16ビット整数unsign...

参考

OpenCV Python Error: error: (-215) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function cv::binary_op
I'm trying to overlay an image of shirt on live video stream of myself using OpenCV Python. I'm stuck at this particular error since three days: error: (-215) ...
エラーコードの意味するところが分かりません。|teratail
python3.6 opencv3です。ソースコードの一部エラーの箇所 bowDescriptors = bowExtractor.compute(lbp, keypoints)エラーコード cv2.error: D:\Build\OpenCV\opencv-3.2.0\modules