- 1.基于Java的图像识别,可以使用OpenCV函数包,本人用了OpenCV3.4.1,配置过程网上很齐全,也比较简单,在此不再赘述。我要识别的线条较粗,所识别的线条是图像中间二维码两侧的横线。因为白条很亮,最先开始我想先对图像制定区域进行二值化处理,再对指定区域进行像素点统计,但该方法准确度不高。最后采用canny+二值化+Hough transform+扫描识别的方案。
- 2 .为了位二维码的一些边缘特性区分开,以及其他反光因素的影响尽可能降低。所以先采取opencv的blur函数进行图像模糊。然后用canny边缘识别函数提取图像的边缘特性,此刻的图像还是包涵了很多其他干扰,采取了二值化,以便识别过程进行特征区分。但是所提取的边缘信息还是很多,并且不好识别线条位置。
- 3.增强较大的轮廓边缘特征,可采用概率霍夫变换或者标准霍夫变换。两种霍夫变换在源代码中都有,我最后采用的是标准霍夫变换,这样识别的线条较为平整。之后就可以进行图像扫描识别。当然我所识别的图像需要对齐,不能有太大的左右角度位移。这也可以增加一个角度旋转的模块,先平齐,而后再识别。
源代码如下
import org.opencv.core.*;
import org.opencv.core.Point;
//import org.opencv.highgui.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.*;
public class Img_confirm {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat image = Imgcodecs.imread("F:\\18\\eclipse-workspace\\img\\0038.jpg");
int []y_location=new int[10];
try
{
Imgproc.blur(image,image,new Size(4,4));//图像模糊
Imgproc.cvtColor(image, image, Imgproc.COLOR_RGB2GRAY);//灰度处理