OpenCVのhconcatがなぜかエラーになるとき


 表題の通りです。エラーメッセージと原因がシンプルに結びついているページがなかったので記事にしました。

 ある画像と別の画像(同じ画像でもよいですが)を連結したい時は、OpenCVのhconcatevconcatを使うのが便利です。例えば、hconat(水平方向への連結)をする場合は当然、お互いの縦ピクセル数を揃える必要があるのですが、時々それを揃えた上でもなぜかエラーが出てくることがあります。

 こんな感じに。

python
combined_image = cv2.hconcat([left_image,right_image])
output
Exception has occurred: error
OpenCV(4.1.2) C:\projects\opencv-python\opencv\modules\core\src\matrix_operations.cpp:68: error: (-215:Assertion failed) src[i].dims <= 2 && src[i].rows == src[0].rows && src[i].type() == src[0].type() in function 'cv::hconcat'

 なんだか行列計算のサイズがあってなさそうです。リサイズを間違えたのでしょうか。printでデバッグします。

print(left_image.shape)
print(right_image.shape)
output
(256, 256)
(256, 256)

 あっとるやないかーい!

 結論的に言うと、データの型が合っていないのが原因です。numpyを使って合わせましょう。

left_image = np.array(left_image)
left_image = out.astype('int32')
right_image = np.array(right_image)
right_image = canny.astype('int32')

 これで連結できるようになります。

おまけ

 ほかありがちなエラー。

高さが違う

 リサイズしましょう。cv2.resize(img,(x,y))でできます。

画像を読み込めていない

 初歩的ですがありがちです。imreadだとパス指定をミスっていても、エラーにならずNoneが返されるのです。printしたらNoneになってないか確認しましょう。

グレースケールとカラー画像を合成しようとしている

 これもありがちです。グレーの画像の方もデータ上はカラー画像にする必要があります。cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)でできます。