如何使用Java OpenCV实现图像向上平移10像素且保持尺寸不变
Java OpenCV 图像向上平移10像素实现方案
图像平移是最简单的仿射变换场景,不需要通过三点映射计算变换矩阵,直接构造2x3的固定平移矩阵即可实现需求,最终输出和原图尺寸完全一致,底部空出区域默认填充黑色,完全匹配预期效果。
可直接运行的正确代码
import org.opencv.core.Mat; import org.opencv.core.CvType; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import org.opencv.highgui.HighGui; public class ShiftImageDemo { public static void main(String[] args) { // 加载OpenCV本地库,可根据自己的环境调整加载逻辑 System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME); // 读取原始图像 Mat originalImg = Imgcodecs.imread("images/ZAD1/myPhoto.jpg"); // 初始化2行3列的单位变换矩阵 Mat shiftMatrix = Mat.eye(2, 3, CvType.CV_32FC1); // 配置平移参数:x方向偏移0,y方向偏移-10(向上平移10像素) shiftMatrix.put(0, 2, 0); shiftMatrix.put(1, 2, -10); // 生成和原图尺寸、类型完全一致的输出图像容器 Mat resultImg = Mat.zeros(originalImg.rows(), originalImg.cols(), originalImg.type()); // 执行仿射变换 Imgproc.warpAffine(originalImg, resultImg, shiftMatrix, resultImg.size()); // 保存结果和展示 Imgcodecs.imwrite("images/ZAD1/shiftedMyPhoto.jpg", resultImg); HighGui.imshow("平移结果", resultImg); HighGui.waitKey(0); HighGui.destroyAllWindows(); } }
原代码错误原因
你之前用的三组点映射计算仿射矩阵的逻辑,是为缩放、旋转、错切这类复杂仿射变换准备的,平移场景不需要这么复杂。你设置的目标点参数不符合平移的坐标映射规则,自然只能得到错乱的变换结果。
如果后续要调整平移参数,直接修改shiftMatrix.put的两个偏移值即可:
- 第一个偏移值控制水平方向:正数向右平移,负数向左平移
- 第二个偏移值控制垂直方向:正数向下平移,负数向上平移
内容的提问来源于stack exchange,提问作者Oliwier Piasecki
相关产品推荐
相关产品推荐

