我最近在OpenCV中将Perspective Transform实现到Android中的应用程序.几乎所有事情都没有问题,但有一方面需要做更多的工作.
问题是我不知道如何计算透视变换的目标图像的正确纵横比(它不必手动设置),因此它可以将图像的纵横比计算为真实的大小尽管相机的角度,事物/图像.请注意,起始坐标不形成梯形,它确实形成四边形.
如果我有一张从大约45度拍摄的书的照片,我希望目标图像宽高比与本书的宽高比几乎相同.拥有2D照片很难,但CamScanner应用程序完美无缺.我已经制作了非常简单的方法来计算目标图像的大小(没有期望它可以按我的意愿工作),但它使图像从45度角缩短约20%,当降低角度时图像高度降低显而易见,尽管角度如此,但CamScanner完美地做到了:
在这里,CamScanner保持目标图像的纵横比(第二个)与书的纵横比相同,即使在~20度角也可以非常精确地保持.
同时,我的代码看起来像这样(在计算目标图像的大小时,我无意让它按照我在这个问题中的要求工作):
public static Mat PerspectiveTransform(Point[] cropCoordinates, float ratioW, float ratioH, Bitmap croppedImage)
{
if (cropCoordinates.length != 4) return null;
double width1, width2, height1, height2, avgw, avgh;
Mat src = new Mat();
List<Point> startCoords = new ArrayList<>();
List<Point> resultCoords = new ArrayList<>();
Utils.bitmapToMat(croppedImage, src);
for (int i = 0; i < 4; i++)
{
if (cropCoordinates[i].y < 0 ) new Point(cropCoordinates[i].x, 0);
startCoords.add(new Point(cropCoordinates[i].x * ratioW, …Run Code Online (Sandbox Code Playgroud) android opencv image-processing computer-vision augmented-reality
我的任务是在画布上绘制许多矩形,但它们都有一个旋转角度,它们必须在画布上旋转。我在寻找此问题的解决方案时遇到的许多建议都指出了绘制矩形和旋转画布的方法(Canvas.rotate(angle)),但它会旋转所有画布,并且只能使用一个矩形。在画布上绘制许多旋转矩形的最佳方法是什么?由于时间效率和内存的原因,我想绘制矩形(单色,使用 Paint),而不是位图。
我目前要做的主要方法是创建大量画布并在每个画布上绘制一个矩形,并考虑矩形的角度来旋转画布。我认为这不是一个聪明的方法,因为有很多画布,对于每个画布,我应该创建一个单独的SurfaceHolder,这是一团糟......
请注意,对于每个矩形,我都有其 4 个角的坐标,即宽度、高度、中心、角度。
我正在尝试从相机预览中捕获图像并对其进行绘制.问题是,我只有大约3-4 fps的绘图,并且一半的帧处理时间是从摄像机预览接收和解码NV21图像并转换为位图.我有一个代码来执行此任务,我在另一个堆栈问题上找到了该代码.它似乎并不快,但我不知道如何优化它.三星Note 3需要大约100-150毫秒,图像尺寸为1920x1080.如何让它更快地运作?
代码:
public Bitmap curFrameImage(byte[] data, Camera camera)
{
Camera.Parameters parameters = camera.getParameters();
int imageFormat = parameters.getPreviewFormat();
if (imageFormat == ImageFormat.NV21)
{
YuvImage img = new YuvImage(data, ImageFormat.NV21, prevSizeW, prevSizeH, null);
ByteArrayOutputStream out = new ByteArrayOutputStream();
img.compressToJpeg(new android.graphics.Rect(0, 0, img.getWidth(), img.getHeight()), 50, out);
byte[] imageBytes = out.toByteArray();
return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
}
else
{
Log.i(TAG, "Preview image not NV21");
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
图像的最终格式必须是位图,因此我可以对其进行处理.我试图将Camera.Parameters.setPreviewFormat设置为RGB_565,但无法将相机参数分配给相机,我还读到NV21是唯一可用的格式.我不确定,是否有可能在这些格式变化中找到解决方案.
先感谢您.