Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
Java 如何获取跟踪图像的角点?_Java_Image_Opencv_Edge Detection - Fatal编程技术网

Java 如何获取跟踪图像的角点?

Java 如何获取跟踪图像的角点?,java,image,opencv,edge-detection,Java,Image,Opencv,Edge Detection,我正在尝试使用边缘检测来查找扫描纸张的4个角,以便将其裁剪出来。下面是我的代码,但它不能正确地检测点。我试图在没有OpenCV的情况下完成这项工作 detectEdges(image); HashMap<Integer, Integer> corners = new HashMap<>(); HashMap<Integer, Integer> reverseCorners = new HashMap<>

我正在尝试使用边缘检测来查找扫描纸张的4个角,以便将其裁剪出来。下面是我的代码,但它不能正确地检测点。我试图在没有OpenCV的情况下完成这项工作

        detectEdges(image);
        HashMap<Integer, Integer> corners = new HashMap<>();
        HashMap<Integer, Integer> reverseCorners = new HashMap<>();


        int white = new Color(255, 255, 255).getRGB();
        int red = new Color(255, 0, 0).getRGB();
        int Blue = new Color(0, 0, 255).getRGB();
        for (int i = 2; i < image.getWidth() - 2; i++) {
            for (int j = 2; j < image.getHeight() - 2; j++) {
                int color = image.getRGB(i, j);
                int right = image.getRGB(i + 1, j);
                int left = image.getRGB(i - 1, j);
                int top = image.getRGB(i, j + 1);
                int bottom = image.getRGB(i, j - 1);
                int rightCheck = image.getRGB(i + 2, j);
                int leftCheck = image.getRGB(i - 2, j);
                int topCheck = image.getRGB(i, j + 2);
                int bottomCheck = image.getRGB(i, j - 2);


                if (color == white) {
                    //TR Corner
                    boolean isCornerLR = (((right != white && rightCheck != white) && (left == white && leftCheck == white)) || ((left != white && leftCheck != white) && (right == white && rightCheck == white)));
                    boolean isCornerTD = (((top != white && topCheck != white) && (bottom == white && bottomCheck == white)) || ((bottom != white && bottomCheck != white) && (top == white && topCheck == white)));
                    if (isCornerLR && isCornerTD) {

                        corners.put(i, j);
                        image.setRGB(i, j, red);


                    }
                }

            }
        }

        HashMap<Integer, Integer> extremeCorners = new HashMap<>();
        /*Get opposite corners of shape. so, Bottom left to Top Right, or Top Left to Bottom Right
        for case one, (LowKey,LowValue), (HighKey, HighKeyValue). Case two - (LowKey,HighValue),(HighKey,LowValue)
        */
        List<Integer> valueOfValue = new ArrayList<>(corners.values());
        for (int a : corners.keySet()) {
            reverseCorners.put(corners.get(a), a);
        }
        Collections.sort(valueOfValue);
        int yCorner1 = valueOfValue.get(valueOfValue.size() - 1);
        int yCorner2 = valueOfValue.get(0);
        int xCorner1 = reverseCorners.get(yCorner1);
        int xCorner2 = reverseCorners.get(yCorner2);
        System.out.println(corners);



        extremeCorners.put(xCorner1, yCorner1);
        image.setRGB(xCorner1, yCorner1, Blue);
        image.setRGB(xCorner2, yCorner2, Blue);
        extremeCorners.put(xCorner2, yCorner2);


        File f = new File("EdgeImages/" + name);
        ImageIO.write(image, "png", f);
        return extremeCorners;

    }
detectEdges(图像);
HashMap角点=新的HashMap();
HashMap reverseCorners=新HashMap();
int-white=新颜色(255、255、255).getRGB();
int red=新颜色(255,0,0).getRGB();
int Blue=新颜色(0,0,255).getRGB();
对于(int i=2;i
这段代码的作用是寻找潜在的角点,用红色标记它们,并将它们添加到hashmap中,这在获取潜在角点时非常准确。从那里,我尝试制作另一个存储了两个角的hashmap。这就是代码不起作用的地方,我确信这是我的逻辑错误,但我不确定如何从这里开始

下面是图片

低精度解决方案:

考虑由轮廓形成的斑点并扫描其像素(轮廓像素可以做到)。对于每个像素,计算X+Y和X-Y的值,并跟踪产生这些量的最小值和最大值的像素。这是四个角。可能是轮廓被分割成几个部分,并且足以使用所有部分的像素

高精度解决方案:

使用上述方法,粗略地找到角点并绘制两条对角线。然后将像素分类为属于这些对角线定义的象限之一。建议丢弃靠近角点的像素,因为它们的分类不确定

最后,使用您喜欢的直线拟合方法,在四个子集的点上拟合一条直线


这里是一个全新的python角落harris检测器实现。这可能是有帮助的。哦,好吧,我正在尝试在没有外部库的情况下这样做,但如果归结起来,我会这样做。我最初尝试在hashmap中获取极值作为角点。搜索直线(拟合)及其交点更准确。关于这一点,当边不是直线时,y和x将偏移一些像素。这使得画一条有交叉点的线是不可能的。是的,我沿着这条线做了一些事情。我使用了距离公式,给出最大距离的点就是一个角,但是谢谢你的解决方案@Mischef9:距离标准也会起作用,不过你需要找到局部最大值,这并不像人们想象的那么容易。我给你提供了一个有四个全局的方法。是的,你是对的。我很欣赏这个解决方案,但我不太确定如何实现它,所以我可能需要为此做更多的思考!