OpenCV Android应用开发学习笔记

通过这一部分的学习有一些Android开发的坑需要注意:

  1. Android 6.0以上的版本如果需要打开摄像头或是相册的操作需要动态申请权限,直接使用Uri uri=data.getData();这种直接读取uri的操作被认为是不安全的,会导致APP无法正常工作,比如我可以通过APP进入相册选取照片,但是不能将照片通过OpenCv处理后显示在APP的界面中;
  2. 可以不用事先在Android端安装OpenCv的环境包,而直接从APP中直接调用OpenCv,但是试过网上的很多方法仍然无法实现,可能是权限之类的问题,有待解决;

这个笔记算是将《深入OpenCv Android应用开发》这本书的内容缩略整理为方便查看的笔记

图像处理函数:src为原图、Size(3,3)表示3x3的核

  1. 均值模糊:Imgproc.blur(src, src, new Size(3, 3));
  2. 高斯模糊:Imgproc.GanssianBlur(src, src, new Size(3, 3), 0);
  3. 中值模糊:Imgproc.medianBlur(src, src, 3);中值模糊不用卷积;
  4. 锐化:这里是用的是自定义核,锐化处理要求锚点像素权重较高。周围权重较低,filter2D()函数对给定的图像和核做卷积
    核:0,-1,0 

                  -1,5,-1
                  0,-1,0

Mat kernel = new Mat(3, 3, CvType.CV_16SC1);
kernel.put(0,0,0,-1,0,-1,5,-1,0,-1,0);
Imgproc.filter2D(src, src, src.depth(), kernel)

  1. 膨胀:这是一种将图像中亮区域扩张的方法可以选取一个适宜尺寸的核,用被核覆盖的最大值代替锚点的像素:
    OpenCV Android应用开发学习笔记_第1张图片

 

 Mat kernelDilate = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));
    Imgproc.dilate(src, src, kernelDilate);

 

OpenCV Android应用开发学习笔记_第2张图片

  1. 腐蚀:和膨胀相反,是一种将图像中按区域扩张的方法。选取一个合适的核,用被覆盖的最小值替代锚点像素,可用来对图像进行降噪:
    OpenCV Android应用开发学习笔记_第3张图片

 Mat kernelErode = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(5, 5));
    Imgproc.erode(src, src, kernelErode);

 

 OpenCV Android应用开发学习笔记_第4张图片

  1. 阈值化:可以将想要在图像中分析的区域分割出来的方法,把每个像素值都与一个预设的阈值做比较,再根据比较的结果调整像素值:

     

    Imgproc.threshold(src, src, 100, 255, Imgproc.THRESH_BINARY);

常量可根据需要改变:
OpenCV Android应用开发学习笔记_第5张图片
OpenCV Android应用开发学习笔记_第6张图片

  1. 自适应阈值:有时对于执行图像分割来说,设置一个全局性阈值并不合适,因为会受到光照条件影响像素的亮度,为克服这个问题,可以根据邻域像素为任意像素计算阈值:
    会用到的三个参数:
    1)自适应方法(两种):

  2.  

          ADAPTIVE_THRESH_MEAN_C:阈值是邻域像素的均值

  3.       ADAPTIVE_THRESH_GAUSSIAN_C:阈值是邻域像素的加权和,权重来自高斯核

    2)块尺寸:即邻域的大小;
    3)常量C:从对每个像素计算得到的均值或加权值减去的常量;

     

    Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2GRAY);
    Imgproc.adaptiveThreshold(src, src, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, 3, 0);

 

你可能感兴趣的:(Android,OpenCv)