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

Repeat an image without using bulit function for repeat image in OpenCV?

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

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;
}

您可以重复一张图片:

  • 创建正确大小的目标图像
  • 在正确的 ROI
  • 中复制具有 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;
}

注释

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