提取文本OpenCV(Java)
我试图在图像中找到文本的边界框。我找到了C++实现。 现在我尝试将其转换为如下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
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++实现相比的两个主要区别。
morphKernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1,9));
Mat maskROI = new Mat(mask, rect);
maskROI.setTo(new Scalar(0, 0, 0));
那会是什么错误呢?如果你看到2个图像不同,但我不明白为什么一些调试可能会有帮助,假设计数被很好地检测到,你可以检查
rect.br()
等的值
maskROI.setTo(new Scalar(0, 0, 0));