OpenCVでの画像連結方法
OpenCVでは複数の画像を連結させたい時は、cv2.hconcat/vconcat関数を用います。例として、以下のコードのように記述します。
main.py
import cv2
img1 = cv2.imread("img1.jpg")
img2 = cv2.imread("img2.jpg")
# サイズをそろえる
window_size = (400,400)
img1 = cv2.resize(img1, window_size)
img2 = cv2.resize(img2, window_size)
# 画像を横に連結
img = cv2.hconcat([img1,img2])
# img = cv2.vconcat([img1,img2]) # 画像を縦に連結する場合
# 画像を表示
while True:
cv2.imshow("img",img)
if cv2.waitKey(1) == ord('q'):
break
cv2.destroyAllWindows()
ここで、ある画像のRGB画像と2値化画像を連結させようとします。
コードは以下のようになると思います。
main.py
# 注:これは間違ったコードです。
import cv2
# 2値化閾値
th = 100
img1 = cv2.imread("img1.jpg")
img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
img1_binary = cv2.threshold(img_gray, th, 255, cv2.THRESH_BINARY)
# サイズをそろえる
window_size = (400,400)
img1 = cv2.resize(img1, window_size)
img1_binary = cv2.resize(img2, window_size)
# 画像を横に連結
img = cv2.hconcat([img1,img1_binary])
# 画像を表示
while True:
cv2.imshow("img",img)
if cv2.waitKey(1) == ord('q'):
break
cv2.destroyAllWindows()
上のコードを実行すると次のようなエラーが出ます
cv2.error: OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-1i5nllza\opencv\modules\core\src\matrix_operations.cpp:67: error: (-215:Assertion failed) src[i].dims <= 2 && src[i].rows == src[0].rows && src[i].type() == src[0].type() in function 'cv::hconcat'
このエラーは、異なるタイプの画像を連結させようとしたために生じたものです。よって画像のタイプを合わせます。例えば連結させる直前に次のコードを記述することで2値化画像をRGB画像として変換させます。
img1_binary = cv2.cvtColor(img1_binary, cv2.COLOR_GRAY2BGR)
すなわち、先ほどの「間違ったコード」を正しく修正したものは以下のようになります。
main.py
import cv2
# 2値化閾値
th = 100
img1 = cv2.imread("img1.jpg")
img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
img1_binary = cv2.threshold(img_gray, th, 255, cv2.THRESH_BINARY)
# 画像のタイプを揃える
img1_binary = cv2.cvtColor(img1_binary, cv2.COLOR_GRAY2BGR) # ←追加
# サイズをそろえる
window_size = (400,400)
img1 = cv2.resize(img1, window_size)
img1_binary = cv2.resize(img2, window_size)
# 画像を横に連結
img = cv2.hconcat([img1,img1_binary])
# 画像を表示
while True:
cv2.imshow("img",img)
if cv2.waitKey(1) == ord('q'):
break
cv2.destroyAllWindows()