Android中OpenCV无裁剪图像旋转:缺失at()方法的技术咨询
在Android OpenCV中实现图像无裁剪旋转的矩阵修改方法
我来帮你搞定这个问题~你在C++里用rot.at<double>(0,2)修改旋转矩阵的平移分量,但Android的OpenCV Java API没有直接的at()方法,我们可以用get()和put()方法来实现完全相同的功能。
核心原理
C++里的rot.at<double>(row, col)是用来直接访问矩阵中指定位置的元素,在Android的OpenCV Java绑定中,我们需要用:
Mat.get(row, col):获取指定位置的元素(返回一个对应类型的数组,因为旋转矩阵是单通道double类型,所以取数组第0个元素即可)Mat.put(row, col, value):把新值设置到指定位置
修正后的完整代码
这里还要注意你原来代码里的一个小错误:Point center的构造参数写反了,应该是(centerX, centerY)而不是(centerY, centerX),不然旋转中心会出错。修正后的代码如下:
private Mat rotateImg(Mat image, double angle) { int centerX = Math.round(image.width() / 2); int centerY = Math.round(image.height() / 2); // 纠正:Point的构造是(x, y),所以应该传centerX, centerY Point center = new Point(centerX, centerY); Mat M = Imgproc.getRotationMatrix2D(center, angle, 1); Rect bbox = new RotatedRect(center, image.size(), angle).boundingRect(); // 替换C++的at()方法,修改旋转矩阵的平移分量 // 处理M(0,2):x方向的平移参数 double[] currentM02 = M.get(0, 2); double dx = bbox.width / 2.0 - center.x; M.put(0, 2, currentM02[0] + dx); // 处理M(1,2):y方向的平移参数 double[] currentM12 = M.get(1, 2); double dy = bbox.height / 2.0 - center.y; M.put(1, 2, currentM12[0] + dy); Imgproc.warpAffine(image, image, M, bbox.size()); return image; }
代码说明
这两行修改的核心作用是调整旋转矩阵的平移参数:
- 旋转矩阵M的第0行第2列是x方向的平移量,第1行第2列是y方向的平移量
- 通过计算
bbox.width/2.0 - center.x和bbox.height/2.0 - center.y,我们得到了让旋转后的图像居中显示在包围盒内所需的偏移量 - 把这个偏移量加到原有的平移参数上,就能让旋转后的图像完整显示,不会被裁剪
内容的提问来源于stack exchange,提问作者LittleTin
相关产品推荐
相关产品推荐

