1.把图片转成灰度图

2.再转成黑白
3.用canny检查边缘

4.查找轮廓

这里查找的是图片中最大的矩形

        Mat src=new Mat();        Mat grayMat=new Mat();        Mat edge=new Mat();        Utils.bitmapToMat(bitmap_src, src);        Imgproc.cvtColor(src,grayMat,Imgproc.COLOR_RGBA2GRAY);        grayMat=processImage(grayMat);        Imgproc.Canny(grayMat,edge,10,200,3,true);        List pointList= getCornersByContour(edge);

 

 

 

    public List getCornersByContour(Mat imgsource){        List contours=new ArrayList<>();        //轮廓检测        Imgproc.findContours(imgsource,contours,new Mat(),Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE);        double maxArea=-1;        int maxAreaIdx=-1;        MatOfPoint temp_contour=contours.get(0);//假设最大的轮廓在index=0处        MatOfPoint2f approxCurve=new MatOfPoint2f();        for (int idx=0;idxmaxArea){                //检测contour是否是四边形                MatOfPoint2f new_mat=new MatOfPoint2f(temp_contour.toArray());                int contourSize= (int) temp_contour.total();                MatOfPoint2f approxCurve_temp=new MatOfPoint2f();                //对图像轮廓点进行多边形拟合                Imgproc.approxPolyDP(new_mat,approxCurve_temp,contourSize*0.05,true);                if (approxCurve_temp.total()==4){                    maxArea=contourarea;                    maxAreaIdx=idx;                    approxCurve=approxCurve_temp;                }            }        }        //把轮廓画出来        /*        Mat mRgba=new Mat();        mRgba.create(imgsource.rows(), imgsource.cols(), CvType.CV_8UC3);        Imgproc.drawContours(mRgba, contours, maxAreaIdx, new Scalar(0,255,0), 5);        Bitmap b12=bitmap_src.copy(Bitmap.Config.ARGB_8888, true);        Utils.matToBitmap(mRgba,b12);        imageView4.setImageBitmap(b12);*/        double[] temp_double=approxCurve.get(0,0);        Point point1=new Point(temp_double[0],temp_double[1]);        temp_double=approxCurve.get(1,0);        Point point2=new Point(temp_double[0],temp_double[1]);        temp_double=approxCurve.get(2,0);        Point point3=new Point(temp_double[0],temp_double[1]);        temp_double=approxCurve.get(3,0);        Point point4=new Point(temp_double[0],temp_double[1]);        List source=new ArrayList<>();        source.add(point1);        source.add(point2);        source.add(point3);        source.add(point4);        //对4个点进行排序        Point centerPoint=new Point(0,0);//质心        for (Point corner:source){            centerPoint.x+=corner.x;            centerPoint.y+=corner.y;        }        centerPoint.x=centerPoint.x/source.size();        centerPoint.y=centerPoint.y/source.size();        Point lefttop=new Point();        Point righttop=new Point();        Point leftbottom=new Point();        Point rightbottom=new Point();        for (int i=0;icenterPoint.x&&source.get(i).ycenterPoint.y){                leftbottom=source.get(i);            }else if (source.get(i).x>centerPoint.x&&source.get(i).y>centerPoint.y){                rightbottom=source.get(i);            }        }        source.clear();        source.add(lefttop);        source.add(righttop);        source.add(leftbottom);        source.add(rightbottom);        return source;    }    private Mat processImage(Mat gray){        Mat b=new Mat();        Imgproc.medianBlur(gray,b,7);        Mat t=new Mat();        Imgproc.threshold(b,t,80,255,Imgproc.THRESH_BINARY);        return t;    }

 

更多相关文章

  1. 如何判断一个点在任意四边形内
  2. 缩小android文档上方框架的"占地面积"
  3. Android(安卓)ScrollView嵌套WebView出现大面积空白页解决方法
  4. Android(安卓)Opencv 获取轮廓坐标,轮廓结构关系
  5. android 全屏 无标题
  6. 基于OpenCV和QT,建立Android图像处理程序
  7. Android 使用 百度地图 测量 多边形面积
  8. Android 什么是 Material Design
  9. [置顶] 基于ichartjs图形库在android上使用HTML动态实现多数据源

随机推荐

  1. android中调试之日志
  2. android sdk setup时出现:Failed to fetc
  3. Android(安卓)XML解析
  4. Android不依赖Activity的全局悬浮窗实现
  5. Android图像开源视图:SmartImageView
  6. Android中做一个无标题窗口
  7. 系出名门Android(7) - 控件(View)之ZoomC
  8. Android联系人数据库全解析(5)
  9. Android中Parcelable接口的使用
  10. Android(安卓)Handler机制1--ThreadLocal