图像旋转与android中的opencv切断图像的边缘

可能重复:
旋转cv :: Mat使用cv :: warpAffine偏移目标图像

下面的代码可以成功地旋转图像,但它会切断图像的angular落,并且旋转方向错误!

Mat cvImage = Highgui.imread("mnt/sdcard/canvasgrid.png"); int degrees = 20; Point center = new Point(cvImage.cols()/2, cvImage.rows()/2); Mat rotImage = Imgproc.getRotationMatrix2D(center, degrees, 1.0); Mat dummy = cvWaterImage; Imgproc.warpAffine(cvImage, dummy, rotImage, cvImage.size()); rotatedImage = dummy; Highgui.imwrite("mnt/sdcard/imageRotate.png",rotatedImage); 

原始图像

旋转的图像

PLUS旋转图像的背景是黑色,但我希望它是透明的。

我做错了什么? 谢谢

编辑解决

首先得到新的旋转图像的宽度/高度

 double radians = Math.toRadians(rotationAngle); double sin = Math.abs(Math.sin(radians)); double cos = Math.abs(Math.cos(radians)); int newWidth = (int) (scaledImage.width() * cos + scaledImage.height() * sin); int newHeight = (int) (scaledImage.width() * sin + scaledImage.height() * cos); int[] newWidthHeight = {newWidth, newHeight}; 

//创build新的大小框(newWidth / newHeight)

 int pivotX = newWidthHeight[0]/2; int pivotY = newWidthHeight[1]/2; 

//旋转水的图像

 org.opencv.core.Point center = new org.opencv.core.Point(pivotX, pivotY); Size targetSize = new Size(newWidthHeight[0], newWidthHeight[1]); 

/ /现在创build另一个垫,所以我们可以使用它来映射

 Mat targetMat = new Mat(targetSize, scaledImage.type()); int offsetX = (newWidthHeight[0] - scaledImage.width()) / 2; int offsetY = (newWidthHeight[1] - scaledImage.height()) / 2; 

//集中水印

 Mat waterSubmat = targetMat.submat(offsetY, offsetY + scaledImage.height(), offsetX, offsetX + scaledImage.width()); scaledImage.copyTo(waterSubmat); Mat rotImage = Imgproc.getRotationMatrix2D(center, waterMarkAngle, 1.0); Mat resultMat = new Mat(); // CUBIC Imgproc.warpAffine(targetMat, resultMat, rotImage, targetSize, Imgproc.INTER_LINEAR, Imgproc.BORDER_CONSTANT, colorScalar); 

//你的resultMat看起来像这样NOT CROPPED Image //顺便说一句,提供的链接和这个解决scheme有很大的不同

Solutions Collecting From Web of "图像旋转与android中的opencv切断图像的边缘"

我只是通过阅读文档: ImgProc.warpAffine

只是一个摘录:

 void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, [...]); //Parameters: dsize – Size of the destination image. 

请尝试以下操作:

 Imgproc.warpAffine(cvImage, dummy, rotImage, dummy.size()); 

为了玩弄透明度,最后摆弄参数:

 Imgproc.warpAffine(cvImage, dummy, rotImage, dummy.size(), INTER_LINEAR, BORDER_TRANSPARENT);