抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

2021.02 第一周目 OpenCV 踩坑小记

java.lang.UnsatisfiedLinkError: No implementation found for long org.opencv.core.Mat.n_Mat()

一上来就是一个运行时错误,原因很简单,解决也很简单:就是 OpenCV 还未初始化,等初始化成功后,再调用 Opencv 相关接口就行。

Android resource linking failed

编译错误中如果提及values28相关信息,大概意思就是 appcompat 和 support 相关的资源库冲突了,这种一般确保 target sdk 以及相关编译工具链版本均为28,此外最好是直接升级到 androidx 版本吧。然后就是多 clean 多 run 吧。感觉像是 AS 的抽风。那种直接清缓存的方式,不治本,也可以试试,但 index 的成本挺高的。

参考:https://stackoverflow.com/questions/49171052/error-android-resource-linking-failed-aapt2-27-0-3-daemon-0

Canvas: trying to draw too large(336063168bytes) bitmap.

自己玩 demo 的时候求简单,把一张大图直接放到了 drawable 目录,然后就出现了,才疏学浅,这个问题才知道,难怪会有 raw 和 assets 目录的区分。

参考:https://stackoverflow.com/questions/39111248/canvas-trying-to-draw-too-large-bitmap-when-android-n-display-size-set-larger

OpenCV 图形特效 锐化

一般在文档处理时候,锐化用得多,用于形成扫描仪的效果。在 PS 中叫 USM 增强锐化,实际上就是高斯模糊与锐化的加权结果。

大概代码:

 //USM(UnSharpen Mask)锐化算法
Mat gaussian_image, USM_image; 
GaussianBlur(image, gaussian_image, Size(), 10, 10);
addWeighted(image, 1.5, gaussian_image, -0.5, 0, USM_image, CV_16S); 
convertScaleAbs(USM_image, USM_image); 
imshow("USM_image", USM_image);

当然还有一些对比度、透明度等处理,以及不断的调试才能得到合适的数值,建议使用 Python 版的 OpenCV进行调试,再应用到 Android 上。

边缘检测

就网络上的资料来说,主要靠的就是 Canny 函数,通常步骤就是:

通过一定的图片处理(一般有几组通道参数)加上对比度、高斯模糊等,通过 for 循环不断调用 Canny 函数,得到尽可能多的结果,再进行结果拟合,筛选一个最合适的结果使用。

一般的边缘识别处理步骤包括:

  • medianBlur 去噪 cvtColor 颜色空间转换 GaussianBlur高斯模糊
  • Canny 边缘检测
  • dilate 膨胀边缘
  • findContour 轮廓探测

关于这些步骤的详情,可以看:矩形边缘检测算法 源码也是有的,因为是一个老外很久前的算法:https://github.com/alyssaq/opencv/blob/master/squares.cpp

以上就能满足了吗?一般来说不行,一般是参数不行,自己调得很难受,毕竟也不是很懂图片相关的内容,所以直接上可能是最佳的方案吧(像 IOS 直接使用苹果提供的 AI 服务就挺爽):

https://github.com/pqpo/SmartCropper

至于机器学习,不过这个涉及的知识范围就很广了,如果有兴趣也可以折腾,腾讯Bugly 就写过一篇不错的文章:

基于 TensorFlow 在手机端实现文档检测


本站由以下主机服务商提供服务支持:

0条评论

发表评论