Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在openCV Java中旋转检测到的矩形_Android_Image_Opencv - Fatal编程技术网

Android 在openCV Java中旋转检测到的矩形

Android 在openCV Java中旋转检测到的矩形,android,image,opencv,Android,Image,Opencv,我已经在网上搜索了一段时间了。问题是我的问题的解决方案主要在Python或C++中可用。我试图复制代码,但没有成功 我检测到一张卡片(矩形),如果矩形是直的,我可以裁剪它,但是如果矩形以一定角度旋转,我会得到一张剪切卡片的图像 显示我想要实现的目标的图像 我的直线图像工作代码 Bitmap abc = null; Point topleft, topright, bottomleft, bottomright; float xRatio = (float) original.getWidth

我已经在网上搜索了一段时间了。问题是我的问题的解决方案主要在Python或C++中可用。我试图复制代码,但没有成功

我检测到一张卡片(矩形),如果矩形是直的,我可以裁剪它,但是如果矩形以一定角度旋转,我会得到一张剪切卡片的图像

显示我想要实现的目标的图像

我的直线图像工作代码

Bitmap abc = null;
Point topleft, topright, bottomleft, bottomright;

float xRatio = (float) original.getWidth() / sourceImageView.getWidth();
float yRatio = (float) original.getHeight() / sourceImageView.getHeight();

float x1 = (points.get(0).x) * xRatio;
float x2 = (points.get(1).x) * xRatio;
float x3 = (points.get(2).x) * xRatio;
float x4 = (points.get(3).x) * xRatio;
float y1 = (points.get(0).y) * yRatio;
float y2 = (points.get(1).y) * yRatio;
float y3 = (points.get(2).y) * yRatio;
float y4 = (points.get(3).y) * yRatio;

Point p1 = new Point(x1, y1);
Point p2 = new Point(x2, y2);
Point p3 = new Point(x3, y3);
Point p4 = new Point(x4, y4);
List<Point> newpoints = new ArrayList<Point>();
newpoints.add(p1);
newpoints.add(p2);
newpoints.add(p3);
newpoints.add(p4);
Collections.sort(newpoints, new Comparator<Point>() {

    public int compare(Point o1, Point o2) {
        return Double.compare(o1.x, o2.x);
    }
});
if (newpoints.get(0).y > newpoints.get(1).y) {

    bottomleft = newpoints.get(0);
    topleft = newpoints.get(1);
} else {
    bottomleft = newpoints.get(1);
    topleft = newpoints.get(0);
}
if (newpoints.get(2).y > newpoints.get(3).y) {
    bottomright = newpoints.get(2);
    topright = newpoints.get(3);
} else {
    bottomright = newpoints.get(3);
    topright = newpoints.get(2);
}
final Mat newimage = new Mat();
Bitmap bmp32 = original.copy(Bitmap.Config.ARGB_8888, true);
org.opencv.android.Utils.bitmapToMat(bmp32, newimage);
final float dd = getAngle(bottomleft, bottomright);

Mat finalMat = new Mat(newimage, new org.opencv.core.Rect(topleft, bottomright));
abc = RotateBitmap(createBitmapfromMat(finalMat), (-dd));
位图abc=null;
指向左上角、右上角、左下角、右下角;
float xRatio=(float)original.getWidth()/sourceImageView.getWidth();
float yRatio=(float)original.getHeight()/sourceImageView.getHeight();
浮点x1=(点获取(0.x)*x比率;
浮点x2=(点。获取(1.x)*x比率;
浮点x3=(点.get(2).x)*x比率;
浮点x4=(点数.get(3.x)*x比率;
浮点y1=(点数.get(0.y)*yRatio;
浮点数y2=(点数.get(1.y)*yRatio;
浮动y3=(点.get(2.y)*yRatio;
浮动y4=(点数.get(3.y)*yRatio;
点p1=新点(x1,y1);
点p2=新点(x2,y2);
点p3=新点(x3,y3);
点p4=新点(x4,y4);
List newpoints=new ArrayList();
新增点。添加(p1);
newpoints.add(p2);
新增点。添加(p3);
新增(p4);
Collections.sort(newpoints,newcomparator(){
公共整数比较(点o1,点o2){
返回Double.compare(o1.x,o2.x);
}
});
if(newpoints.get(0.y)>newpoints.get(1.y){
bottomleft=newpoints.get(0);
左上=newpoints.get(1);
}否则{
bottomleft=newpoints.get(1);
左上=newpoints.get(0);
}
if(newpoints.get(2.y)>newpoints.get(3.y){
bottomright=newpoints.get(2);
topright=newpoints.get(3);
}否则{
bottomright=newpoints.get(3);
topright=newpoints.get(2);
}
最终材料新图像=新材料();
位图bmp32=original.copy(Bitmap.Config.ARGB_8888,true);
org.opencv.android.Utils.bitmapToMat(bmp32,newimage);
最终浮动dd=getAngle(左下、右下);
Mat finalMat=new Mat(newimage,neworg.opencv.core.Rect(左上、右下));
abc=旋转位图(createBitmapfromMat(finalMat),(-dd));
矩形为直线时的当前代码:

旋转矩形时的当前代码:

类似问题的链接:

您被困在哪一步?请描述一下你的问题,比如我不知道如何在C++中用java做X指令…我认为您需要使用OpenCV中的findHomography和warpAffine等函数来实现类似的结果。。。我在你的代码中看不到这些。我要裁剪的矩形是旋转的,当我使用上述方法裁剪它时,矩形被剪切,我想要完整的矩形。你能添加当前结果的图像吗?编辑了这个问题。如果你知道旋转前图像的坐标以及旋转的幅度,你可以很容易地使用