Java学习记录--OpenCV使用教程

http://blog.csdn.net/u012706811/article/details/52779271


环境搭建:

下载openCV后,把build文件夹里面的Java拷贝到项目目录

主程序里面启动前加载该库

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        //注意程序运行的时候需要在VM option添加该行 指明opencv的dll文件所在路径
        //-Djava.library.path=$PROJECT_DIR$\opencv\x64
    }
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

IDEA内这样配置

这里写图片描述


例图: 
这里写图片描述


1.Mat与BufferedImage的转换

Mat类是OpenCV最基本的一个数据类型,它可以表示一个多维的多通道的数组。Mat常用来存储图像,包括单通道二维数组——灰度图,多通道二维数组——彩色图。

1.1 mat转BufferedImage

        Mat grayMat = Highgui.imread("E:/temp/3.jpg");
        byte[] data1 = new byte[grayMat.rows() * grayMat.cols() * (int)(grayMat.elemSize())];
        grayMat.get(0, 0, data1);
        BufferedImage image1 = new BufferedImage(grayMat.cols(),
                                grayMat.rows(),BufferedImage.TYPE_BYTE_GRAY);
        image1.getRaster().setDataElements(0, 0, grayMat.cols(), grayMat.rows(), data1);
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

1.2 BufferedImage转mat

    BufferedImage src = ImageIO.read(input);
    Mat srcMat = new Mat(src.getHeight(), src.getWidth(), CvType.CV_8UC3);
 
 
  • 1
  • 2
  • 1
  • 2

2.图片灰度化

就是把图片转换为黑白照

        Imgproc.cvtColor(srcMat, destMat, Imgproc.COLOR_RGB2GRAY);
 
 
  • 1
  • 1

该函数把原srcMat转换为灰度图像放入grayMat中,自己再转换为BufferedImage显示即可.

这里写图片描述

3.二值化处理

也就是只留两个值,黑白

         Mat binaryMat = new Mat(grayMat.height(),grayMat.width(),CvType.CV_8UC1);
        Imgproc.threshold(grayMat, binaryMat, max1, max2, Imgproc.THRESH_BINARY);
 
 
  • 1
  • 2
  • 1
  • 2

这里写图片描述

4.图像腐蚀

这里使用3*3的图片去腐蚀

        Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));
        Imgproc.erode(srcMat,destMat,element);
 
 
  • 1
  • 2
  • 1
  • 2

腐蚀后变得更加宽,粗.便于识别 
这里写图片描述

5.遍历,获取和修改像素值

二值图片,当成一个二维矩阵就可以了,双重循环,使用get方法获取像素点,使用put方法修改像素点

     for (int y = 0; y < imgSrc.height(); y++)
        {
            for (int x = 0; x < imgSrc.width(); x++)
            {
                //得到该行像素点的值
                    double[] data = imgSrc.get(y,x);
                    for (int i1 = 0; i1 < data.length; i1++) {
                        data[i1] = 255;//像素点都改为白色
                    }
                    imgSrc.put(i,j,data);
            }
        }
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

6.过滤和切割

过滤和切割要找到一个开始行或列,结束行或列,这就有一个简单的算法.该算法从第一行开始遍历,统计每一行的像素点值符合阈值的个数,再根据个数判断该点是否为边界.找到后过滤和切割自然就很简单了,直接创建个该范围的新的Mat对象.

        for (int y = 0; y < imgSrc.height(); y++)
        {
            int count = 0;
            for (int x = 0; x < imgSrc.width(); x++)
            {
                //得到该行像素点的值
                byte[] data = new byte[1];
                imgSrc.get(y, x, data);
                if (data[0] == 0)
                    count = count + 1;
            }
            if (state == 0)//还未到有效行
            {
                if (count >= 150)//找到了有效行
                {//有效行允许十个像素点的噪声
                    a = y;
                    state = 1;
                }
            }
            else if (state == 1)
            {
                if (count <= 150)//找到了有效行
                {//有效行允许十个像素点的噪声
                    b = y;
                    state = 2;
                }
            }
        }
        System.out.println("过滤下界"+Integer.toString(a));
        System.out.println("过滤上界"+Integer.toString(b));
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

截取

        //参数,坐标X,坐标Y,截图宽度,截图长度
        Rect roi = new Rect(0, 0, imgSrc.width(), b - a);
        Mat res = new Mat(new Size(roi.width, roi.height),CvType.CV_8UC1);
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

过滤是从上到下,判断该行的黑色像素点是否大于一定值,大于则留下,找到上边界,下边界后立即停止. 
这里写图片描述

7.识别

使用tesseract-ocr进行识别,效果还是很不错的.github地址

这里写图片描述

8.资料

后来发现一个很不错的网站,分享一下,里面有一些使用案例

http://www.w3ii.com/java_dip/default.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值