不使用bulit函数重复图像以在OpenCV中重复图像?

时间:2015-10-12 20:49:01

标签: c++ opencv image-processing matrix-multiplication

基本上,如果我们定义一个函数,即repeat_image,在该函数中取三个参数,一个矩阵图像和两个整数nx,ny,并通过重复图像nx返回一个nx ny倍的新图像< / em> ny次。 因此,如果初始图像是640 * 480,则repeat_image(img,2,2)将返回大小为1280 * 960的图像。 论点是: - 矩阵图像(类型Mat) - 整数nx,矩阵应沿水平轴重复的次数 - 整数ny,矩阵应沿垂直轴重复的次数

2 个答案:

答案 0 :(得分:0)

Mat image_repeat(Mat &img, int nx, int ny) 

{


    Mat img_repeat(Size(nx * img.cols, ny * img.rows), CV_8UC3);
    int y = 0, x = 0;
    while (y < ny)
     { //0<3
        while (x < nx)
          { //0<2
            for (int row = 0; row < img.rows; row++) 
              {
                for (int col = 0; col < img.cols; col++)
                  {
                    img_repeat.at<Vec3b>(Point(col + (img.cols * x), row + (img.rows * y))) =img.at<Vec3b>(Point(col, row));
                    }
              }
            x++;
        }
        x = 0;
        y++;
    }

    cout << "Image Repeat Done." << endl;

    return img_repeat;
}

答案 1 :(得分:0)

您可以重复图片:

  • 创建正确尺寸的目标图像
  • 使用cv::copyTo在正确的投资回报率中复制源图像

代码:

#include <opencv2/opencv.hpp>
using namespace cv;

Mat image_repeat(const Mat& src, int nx, int ny)
{
    Mat dst(src.rows * ny, src.cols * nx, src.type());

    for (int iy = 0; iy < ny; ++iy)
    {
        for (int ix = 0; ix < nx; ++ix)
        {
            Rect roi(src.cols * ix, src.rows * iy, src.cols, src.rows);
            src.copyTo(dst(roi));
        }
    }
    return dst;
}


int main()
{
    Mat3b img = imread("path_to_image");

    Mat3b res = image_repeat(img, 4, 3);

    imshow("img", img);
    imshow("res", res);
    waitKey();

    return 0;
}

备注

  • 此方法适用于任何类型的输入图像