我正在开发一个OCR应用程序,用Java构建为Android应用。 我想从相机拍摄的图像中检测文本,并使用OpenCV进行预处理,但我得到了一些额外的线条被识别成文本,我已经遵循了以下方法:
1-将RGB转换为灰度 2-阈值 3-高斯模糊 4-中值模糊 5-膨胀 6-腐蚀
结果至少比以前好,但仍然没有得到正确的结果。如何去除这种噪声,有哪些通用的滤镜序列可以应用于任何图像以改善OCR结果。我对OpenCV是新手,请指导我。谢谢。 旧图像
1-将RGB转换为灰度 2-阈值 3-高斯模糊 4-中值模糊 5-膨胀 6-腐蚀
结果至少比以前好,但仍然没有得到正确的结果。如何去除这种噪声,有哪些通用的滤镜序列可以应用于任何图像以改善OCR结果。我对OpenCV是新手,请指导我。谢谢。 旧图像
从上面的图像中,我能够找到第3个结果,但只有当所有轮廓都被绘制出来时,这是我不想要的,因为噪声也会被绘制出来。我在这里遗漏了什么?不知道该怎么办了。
修改后的代码:
package simple_contours;
import java.util.ArrayList;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
public class Main {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat src_img,src_grey,src_blur,src_thresh,src_dilate,dest_img;
src_img=Highgui.imread("n_num.jpg",Imgproc.COLOR_BGR2GRAY);
src_grey=new Mat(src_img.size(), Core.DEPTH_MASK_8U);
src_blur=new Mat(src_img.size(), Core.DEPTH_MASK_8U);
src_thresh=new Mat(src_img.size(), Core.DEPTH_MASK_8U);
src_dilate=new Mat(src_img.size(), Core.DEPTH_MASK_8U);
dest_img=Mat.zeros(640,480, CvType.CV_8UC3);
Core.bitwise_not(dest_img, dest_img);
Highgui.imwrite("dest.jpg", dest_img);
Imgproc.cvtColor(src_img, src_grey, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(src_grey, src_blur, new Size(3, 3), 0);
Imgproc.threshold(src_blur, src_thresh, 80, 255, Imgproc.THRESH_BINARY_INV);
Imgproc.dilate(src_thresh, src_dilate, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2, 2)));
Highgui.imwrite("Threshold.jpg", src_thresh);
Highgui.imwrite("Dilate.jpg", src_dilate);
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat heirarchy= new Mat();
Point shift=new Point(150,0);
Imgproc.findContours(src_dilate, contours,heirarchy, Imgproc.RETR_TREE,Imgproc.CHAIN_APPROX_SIMPLE,shift);
double[] cont_area =new double[contours.size()];
for(int i=0; i< contours.size();i++)
{
Rect rect = Imgproc.boundingRect(contours.get(i));
cont_area[i]=Imgproc.contourArea(contours.get(i));
System.out.println("Hight: "+rect.height);
System.out.println("WIDTH: "+rect.width);
System.out.println("AREA: "+cont_area[i]);
//System.out.println(rect.x +","+rect.y+","+rect.height+","+rect.width);
Core.rectangle(src_img, new Point(rect.x,rect.y), new Point(rect.x+rect.width,rect.y+rect.height),new Scalar(0,0,255));
Imgproc.drawContours(dest_img, contours, i, new Scalar(0,0,0),-1,8,heirarchy,2,shift);
Core.rectangle(dest_img, new Point(rect.x,rect.y), new Point(rect.x+rect.width,rect.y+rect.height),new Scalar(0,255,0));
}
Highgui.imwrite("Final.jpg", dest_img);
Highgui.imwrite("Original.jpg", src_img);
}
}