Image Offset 將影像在水平/垂直方向平移指定像素。支援兩種模式:
xOffset, yOffset(可正可負)。xOffset = ((xOffset % w) + w) % w 正規化至 [0, w-1];同理 yOffset。(x, y),計算源座標:src_x = (x + w - xOffset) % w,src_y = (y + h - yOffset) % h。src_x = x - xOffset,src_y = y - yOffset,檢查邊界。#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void showImage(const Mat& img, const string& name) {
namedWindow(name, WINDOW_AUTOSIZE);
imshow(name, img);
}
int main() {
Mat src = imread("4.jpg");
if (src.empty()) return -1;
Mat dst(src.size(), src.type());
int xOffset = 150, yOffset = 100;
bool warp = true; // true=環繞, false=裁剪
int w = src.cols, h = src.rows;
if (warp) {
xOffset = ((xOffset % w) + w) % w;
yOffset = ((yOffset % h) + h) % h;
}
for (int y = 0; y < h; ++y) {
for (int x = 0; x < w; ++x) {
int sx, sy;
if (warp) {
sx = (x + w - xOffset) % w;
sy = (y + h - yOffset) % h;
} else {
sx = x - xOffset;
sy = y - yOffset;
if (sx < 0 || sx >= w || sy < 0 || sy >= h) {
dst.at<Vec3b>(y, x) = Vec3b(0,0,0); // 黑色填充
continue;
}
}
dst.at<Vec3b>(y, x) = src.at<Vec3b>(sy, sx);
}
}
showImage(dst, "Image Offset");
waitKey(0);
return 0;
}
// 使用仿射變換矩陣
Mat M = (Mat_<double>(2,3) << 1, 0, xOffset, 0, 1, yOffset);
warpAffine(src, dst, M, src.size(), INTER_LINEAR, BORDER_WRAP); // 環繞
// 或 BORDER_CONSTANT, Scalar(0) 裁剪填充黑色
warpAffine 內建高優化、支援插值與多種邊界模式,實務上優先使用。