Java 使用四个点的OpenCV裁剪图像

Java 使用四个点的OpenCV裁剪图像,java,android,image,opencv,crop,Java,Android,Image,Opencv,Crop,我正在尝试裁剪图像,然后才能显示图像。我在两个数组中有四个点,它将形成一个矩形。我有一个代码,我认为可以做的工作,但它给出了一个错误。这是我希望你能帮助我的代码。我使用的是android,并且只使用Java int startX =locListX.get(0); int startY =locListY.get(0); Collections.sort(locListX); Collections.sort(locListY); int width=locListX.get(3)-locLis

我正在尝试裁剪图像,然后才能显示图像。我在两个数组中有四个点,它将形成一个矩形。我有一个代码,我认为可以做的工作,但它给出了一个错误。这是我希望你能帮助我的代码。我使用的是android,并且只使用Java

int startX =locListX.get(0);
int startY =locListY.get(0);
Collections.sort(locListX);
Collections.sort(locListY);
int width=locListX.get(3)-locListX.get(0);
int height=locListY.get(3)-locListY.get(0);
Mat image = mFind;
Rect rectCrop = new Rect(startX, startY, width, height);
Mat imCrop=  new Mat(image,rectCrop); 
Utils.matToBitmap(imCrop, bmp5);
mGrayView.setImageBitmap(bmp5);

在这种方法中,您可以获得文件的四个点和垫,然后可以使用以下方法剪切此图像:

       public Bitmap warpDisplayImage(Mat inputMat) {
List<Point> newClockVisePoints = new ArrayList<>();

int resultWidth = inputMat.width();
int resultHeight = inputMat.height();

Mat startM = Converters.vector_Point2f_to_Mat(orderRectCorners(Previes method four poit list(like : List<Point> points)));

Point ocvPOut4 = new Point(0, 0);
Point ocvPOut1 = new Point(0, resultHeight);
Point ocvPOut2 = new Point(resultWidth, resultHeight);
Point ocvPOut3 = new Point(resultWidth, 0);



    ocvPOut3 = new Point(0, 0);
    ocvPOut4 = new Point(0, resultHeight);
    ocvPOut1 = new Point(resultWidth, resultHeight);
    ocvPOut2 = new Point(resultWidth, 0);
}

Mat outputMat = new Mat(resultWidth, resultHeight, CvType.CV_8UC4);

List<Point> dest = new ArrayList<Point>();
dest.add(ocvPOut3);
dest.add(ocvPOut2);
dest.add(ocvPOut1);
dest.add(ocvPOut4);


Mat endM = Converters.vector_Point2f_to_Mat(dest);

Mat perspectiveTransform = Imgproc.getPerspectiveTransform(startM, endM);

Imgproc.warpPerspective(inputMat, outputMat, perspectiveTransform, new Size(resultWidth, resultHeight), Imgproc.INTER_CUBIC);


Bitmap descBitmap = Bitmap.createBitmap(outputMat.cols(), outputMat.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(outputMat, descBitmap);



return descBitmap;
公共位图显示图像(Mat inputMat){
List newClockVisePoints=new ArrayList();
int resultWidth=inputMat.width();
int resultHeight=inputMat.height();
Mat startM=Converters.vector_Point2f_to_Mat(orderRectCorners(预览方法四点列表(如:列表点));
点ocvPOut4=新点(0,0);
点ocvPOut1=新点(0,结果右侧);
点ocvPOut2=新点(结果宽度,结果宽度);
点ocvPOut3=新点(结果宽度,0);
ocvPOut3=新点(0,0);
ocvPOut4=新点(0,结果右侧);
ocvPOut1=新点(结果宽度,结果宽度);
ocvPOut2=新点(结果宽度,0);
}
Mat outputMat=新Mat(结果宽度、结果宽度、CvType.CV_8UC4);
List dest=new ArrayList();
目的地添加(ocvPOut3);
目的地添加(ocvPOut2);
目的地添加(ocvPOut1);
目的地添加(ocvPOut4);
Mat endM=转换器。向量点2f到Mat(dest);
Mat perspectiveTransform=Imgproc.getPerspectiveTransform(startM,endM);
Imgproc.warpPerspective(输入框、输出框、透视变换、新大小(resultWidth、ResultWight)、Imgproc.INTER_立方体);
Bitmap descBitmap=Bitmap.createBitmap(outputMat.cols(),outputMat.rows(),Bitmap.Config.ARGB_8888);
Utils.matToBitmap(outputMat,descBitmap);
返回位图;

}

您会遇到什么错误?请同时打印两个集合的内容。集合基本上是上左、上右、下右、下左,一个是x位置,另一个是y位置,我只想得到一个我想要看到的大致矩形。我使用模板匹配来获取点,因此我只需使用左上角的点作为起点,然后使用排序来获取imageError的最长宽度和高度:断言失败(src.dims==2&&info.height==(uint32_t)src.rows&&info.width==(uint32_t)src.cols)in void Java\u org\u opencv\u android\u Utils)\u nMatToBitmap2(JNIEnv*,jclass,jlong,jobject,jboolean,file/home/reports/ci/slave/opencv/modules/java/generator/src/cpp/util.cpp,第107行NMattobramt捕获的位图cv::Exception:/home/report/ci/slave/opencv/modules/java/generator/src/utils.cpp:107:错误:(-215)src.dims==2&&info.height==(uint32_t)src.rows&info.width==(uint32))函数void Java_org)opencv_android_Utils_nMatToBitmap2(KNIENV*、jclass、jlong、jobject、jboolean)中的src.cols我解决了我的问题我搞乱了bmp5的创建尝试使用buffereImage