使用OpenCV将小图像拼接成更大的图像

时间:2012-07-10 14:38:37

标签: c++ opencv image-processing

假设我有200x200像素的图像。我想要一个800x800像素版本,我基本上复制200x200图像并用800x800图像填充(将较小的图像平铺到较大的图像中)。

你会如何在openCV中做到这一点?这看起来很简单,但我不知道如何创建另一个与模式相同类型的cv :: Mat,但是具有更大的尺寸(画布大小)或者如果可以拍摄原始的200x200像素图像和增加它的行和列然后只需使用一个循环将角落粘贴到图像的其余部分。

我正在使用openCV 2.3顺便说一句。我已经对固定尺寸的图像进行了一些处理,但在增加矩阵的尺寸方面,我有点无能为力。

3 个答案:

答案 0 :(得分:4)

如果您对OpenCV <{3}}感兴趣平铺

答案 1 :(得分:0)

仅供参考 - @ karlphillip回复中的博客,基本思路是使用cvSetImageROIcvResetImageROI。两者都是C API。

在以后的版本中,例如v2.4和3.x,可以定义具有所需位置和尺寸的Rect,并将所需的部分称为img(rect)

C API(功能样式)中的示例:

cvSetImageROI(new_img, cvRect(tlx, tly, width, height);
cvCopy(old_img, new_img);
cvResetImageROI(new_img);

在使用类的C ++ API中:

Mat roi(new_img, Rect(tlx, tly, width, height));
roi = old_img;    // or old_img.clone()

C ++中的另一种方式(复制图像):

old_img.copyTo(new_img(Rect(tlx, tly, width, height)))

答案 2 :(得分:0)

您可以使用 repeat 函数:

def tile_image(img, tile):
  height, width, channels = img.shape
  tile_width, tile_height, tile_channel = tile.shape
  
  x_counts = int(width / tile_width) + 1
  y_counts = int(height / tile_height) + 1

  tiled = np.tile(tile,(y_counts,x_counts,1))
  return tiled[0:height, 0:width]