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 
                     
                    
                 
                    
                