GoCV下实现多图片单窗口内同时显示
问题
OPENCV的IMShow一次只能显示一张图片,但是很多时候我们需要同时显示多张图片。
方案一
网上搜索解决方案,多数是基于Python的,要么用numpy的hstack/vstack,要么使用plt解决。所幸,在opencv函数中找到了hconcat和vconcat,但是hconcat需要图片高度一致,vconcat需要图片宽度一致。我这里选用hconcat,以第一张图片的高度为基准,其他图片resize到同样高度,但是为了图片不变形,宽度要按照高度变化比例缩放。
func ShowImages(title string,imgs ...cv.Mat,)*cv.Window{
if len(imgs)==0{
fmt.Println("[showImg] should give me at least one image!")
return nil
}
img, width, height:=StackImagesHV(imgs...)
defer func(img cv.Mat){
if img.Size()[0]!=imgs[0].Size()[0]{ img.Close() }
}(img)
win:=cv.NewWindow(title)
win.SetWindowTitle(title)
win.ResizeWindow(width, height )
//
win.IMShow(img)
return win
}
func StackImagesH(imgs ...cv.Mat) (img cv.Mat, width int, height int){
if len(imgs)==0{
panic("[StackImagesH] should give me at least one image!")
}
img=cv.NewMat()
if len(imgs)==1{
img = imgs[0].Clone()
width,height=ImageSize(img)
return
}
imgs[0].CopyTo(&img)
width,height = ImageSize(imgs[0])
for i:=1;i<len(imgs);i++{
pic:=imgs[i]
tw,th:=ImageSize(pic)
if th!=height {
np,nw:=ResizeImageByHeight(pic, height