在 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;
}
注释
- 此方法适用于任何类型的输入图像
基本上在这里,如果我们定义一个函数,即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;
}
注释
- 此方法适用于任何类型的输入图像