Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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
提取文本OpenCV(Java)_Java_Opencv - Fatal编程技术网

提取文本OpenCV(Java)

提取文本OpenCV(Java),java,opencv,Java,Opencv,我试图在图像中找到文本的边界框。我找到了C++实现。 现在我尝试将其转换为如下Java代码: import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.imageio.ImageIO; import org.opencv.core.*; import org.opencv.highgui.Highgui; import org

我试图在图像中找到文本的边界框。我找到了C++实现。 现在我尝试将其转换为如下Java代码:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

import org.opencv.core.*;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.*;

public class Scritte {
    public static void main(String[] args) {

    // Load the native library.
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        new Nuova().analizza();
    }
}

class Nuova{
    public void analizza(){

        Mat Main = Highgui.imread("/.../Ole.png");
        Mat rgb = new Mat();

        Imgproc.pyrDown(Main, rgb);

        Mat small = new Mat();

        Imgproc.cvtColor(rgb, small, Imgproc.COLOR_RGB2GRAY);

        Mat grad = new Mat();

        Mat morphKernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(3,3));

        Imgproc.morphologyEx(small, grad, Imgproc.MORPH_GRADIENT , morphKernel);

        Mat bw = new Mat();

        Imgproc.threshold(grad, bw, 0.0, 255.0, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU);

        Mat connected = new Mat();

        morphKernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1,9));

        Imgproc.morphologyEx(bw, connected, Imgproc.MORPH_CLOSE  , morphKernel);


        Mat mask = Mat.zeros(bw.size(), CvType.CV_8UC1);

        List<MatOfPoint> contours = new ArrayList<MatOfPoint>();

        Mat hierarchy = new Mat();

        Imgproc.findContours(connected, contours, hierarchy, Imgproc.RETR_CCOMP, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0, 0));

        for(int idx = 0; idx < contours.size(); idx++)
        {
            Rect rect = Imgproc.boundingRect(contours.get(idx));

            Mat maskROI = new Mat(mask, rect);

            Imgproc.drawContours(mask, contours, idx, new Scalar(255, 255, 255), Core.FILLED);

            double r = (double)Core.countNonZero(maskROI)/(rect.width*rect.height);

            if (r > .45 && (rect.height > 8 && rect.width > 8))
            {
                Core.rectangle(rgb, rect.br() , new Point( rect.br().x-rect.width ,rect.br().y-rect.height),  new Scalar(0, 255, 0));
            }

            String outputfile = "trovato.png";
            Highgui.imwrite(outputfile,rgb);
       }        
    }
}
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入javax.imageio.imageio;
导入org.opencv.core.*;
导入org.opencv.highgui.highgui;
导入org.opencv.imgproc.*;
公费班票{
公共静态void main(字符串[]args){
//加载本机库。
System.loadLibrary(Core.NATIVE\u LIBRARY\u NAME);
新的Nuova().analizza();
}
}
诺瓦级{
公共空间分析(){
Mat Main=Highgui.imread(“/…/Ole.png”);
Mat rgb=新Mat();
Imgproc.pyrDown(主要,rgb);
垫小=新垫();
Imgproc.cvt颜色(rgb,小,Imgproc.COLOR\u RGB2GRAY);
材料梯度=新材料();
Mat morphKernel=Imgproc.getStructuringElement(Imgproc.morp_椭圆,新大小(3,3));
Imgproc.morphologyEx(小,梯度,Imgproc.morp_梯度,morphKernel);
Mat bw=新Mat();
Imgproc.阈值(梯度,bw,0.0,255.0,Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU);
连接垫=新垫();
morphKernel=Imgproc.getStructuringElement(Imgproc.morprect,新大小(1,9));
Imgproc.morphologyEx(bw,connected,Imgproc.MORPH\u CLOSE,morphKernel);
Mat mask=Mat.zero(bw.size(),CvType.CV_8UC1);
列表等高线=新的ArrayList();
Mat层次结构=新Mat();
Imgproc.findContours(连通、等高线、层次、Imgproc.RETR\u CCOMP、Imgproc.CHAIN\u近似、简单、新点(0,0));
对于(int idx=0;idx0.45&&(rect.height>8&&rect.width>8))
{
矩形(rgb,rect.br(),新点(rect.br().x-rect.width,rect.br().y-rect.height),新标量(0,255,0));
}
字符串outputfile=“trovato.png”;
imwrite(输出文件,rgb);
}        
}
}
我认为错误在FOR循环中,但我无法解决它。 有人能帮我吗

(以下用C++和java语言中的结果)< /P> 使用C++时:

使用Java:

下面是java代码中与C++实现相比的两个主要区别。

  • 您的形态学内核是9x1(hxw),而在原始代码中是1x9。所以把它从

    morphKernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1,9));
    
  • 您没有将maskROI设置为零

    Mat maskROI = new Mat(mask, rect);
    
  • 在调用drawContours之前添加以下代码行

    maskROI.setTo(new Scalar(0, 0, 0));
    

    那会是什么错误呢?如果你看到2个图像不同,但我不明白为什么一些调试可能会有帮助,假设计数被很好地检测到,你可以检查
    rect.br()
    等的值
    maskROI.setTo(new Scalar(0, 0, 0));