牙叔教程简单易懂功能 rgb通道分离 hsv通道分离 灰度化 边缘检测 二值化 霍夫直线 简介 本项目集合了一些opencv的常用操作,rgb通道分离hsv通道分离灰度化边缘检测。二值化。霍夫直线 脚本框架已经搭好,有能力的话可以添加更多的操作, 比如霍夫圆,膨胀腐蚀等形态学操作 项目目录 主界面上方选择图片下方列出功能按钮 点击按钮跳转至对应的功能界面 按钮点击事件 遍历按钮添加点击事件,因为所有按钮行为都是类似的buttons。map((button){button。on(click,function(view){。。。});}); 启动对应脚本,带上工具名字,图片路径,以及当前工作路径engines。execScriptFile(toolPath,{arguments:{toolName:toolName,imgPath:currentImgPath,fromPath:files。path(。)},}); 为什么要带上当前工作路径? 因为常用的工具函数都在根目录放着,要在新脚本中导入根目录的工具函数,需要require工具函数的绝对路径varargsengines。myEngine()。execAletfromPathargs。fromPletyashuImgToolrequire(files。join(fromPath,。yashuImgTool));怎样给新脚本传递图片信息 一开始想直接把URI传给新脚本,但是报错了,说用户不匹配之类的, 然后就换了个办法,把图片保存到手机上,传递文件路径 保存bitmapcurrentImgcom。stardust。autojs。core。image。ImageWrapper。ofBitmap(bitmap);letimgPathfiles。join(dirPath,img。png);files。createWithDirs(imgPath);images。save(currentImg,imgPath); URI转图片functiongetBitmapFromUri(uri){returnandroid。provider。MediaStore。Images。Media。getBitmap(context。getContentResolver(),uri);} 工具脚本结构,以边缘检测为例边缘检测接收主脚本传递过来的数据varargsengines。myEngine()。execA接收的数据args{fromPath:datadataorg。autojs。autojsprocacheremoteproject3a26c38d0089d40061afbd09dacd38b5,imgPath:storageemulated0脚本opencvToolboximg。png,toolName:边缘检测,};导入工具模块letyashuImgToolrequire(files。join(fromPath,。yashuImgTool)); 模块里面是一些常用的函数 处理图片读取灰度图varimgGrayImgcodecs。imread(imgPath,0);降噪Imgproc。GaussianBlur(imgGray,imgBlur,Size(3,3),0);边缘检测Imgproc。Canny(imgBlur,imgCanny,cannyParam。threshold1,cannyParam。threshold2,cannyParam。apertureSize,false);显示界面 显示刚才处理过的图片letbitmapyashuImgTool。mat2bitmap(imgCanny);ui。img。setImageBitmap(bitmap);设置滑块监听 由于滑块功能类似,因此可以设计一个通用的函数,批量设置监听seekbarBindingTextAndCannyParam(ui。threshold1ControlView,ui。threshold1ValueShowView,threshold1);seekbarBindingTextAndCannyParam(ui。threshold2ControlView,ui。threshold2ValueShowView,threshold2);seekbarBindingTextAndCannyParam(ui。apertureSizeControlView,ui。apertureSizeValueShowView,apertureSize);只响应用户的操作functionseekbarBindingTextAndCannyParam(seekbarView,textView,cannyParamName){seekbarView。setOnSeekBarChangeListener(newandroid。widget。SeekBar。OnSeekBarChangeListener({onProgressChanged:function(seekbar,progress,fromUser){if(fromUser){。。。}},}));}特殊参数,特殊处理 测试的时候,apertureSize太大就会报错,偶数也报错,因此需要特殊处理; 注意同时修改滑块显示的数值letvalueparseInt(progress);cannyParam〔cannyParamName〕if(cannyParamNameapertureSize){apertureSizevalue3;if(apertureSize20){apertureSize1;seekbarView。setProgress(progress1);}textView。setText(apertureSize);}else{textView。setText(value);}节流 因为处理图片,需要一定的时间,因此使用防抖操作, 在一定时间内,只处理用户最后一次的操作functiondebounce(fn,delay){delaydelay500;returnfunction(){if(timer){clearTimeout(timer);}timersetTimeout((){fn。apply(this,args);},delay);};}letdebounceRefreshMatyashuTool。debounce(refreshMat);刷新图片 设置新图片,回收旧图片,避免内存泄漏functionrefreshMat(){ui。img。setImageBitmap(bitmap);ui。post(function(){oldBitmap。recycle();},200);}霍夫直线letHoughLinesPParam{threshold:22,阈值,只有获得足够交点的极坐标点才被看成是直线minLineLength:22,最小直线长度,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。maxLineGap:22,最大间隔,有默认值0,允许将同一行点与点之间连接起来的最大的距离。};letlinesnewMat();Imgproc。HoughLinesP(imgCanny,lines,1,Math。PI180,HoughLinesPParam。threshold,HoughLinesPParam。minLineLength,HoughLinesPParam。maxLineGap); 以上就是边缘检测工具脚本的大概流程,其他opencv工具脚本流程与它类似 备注 不同软件测出来的阈值不一样, 比如你用PS和autojs测出来的二值化阈值就不一样, 因此,浏览初步效果可以在ps上看, 要测出合适的数值,就要在手机上操作 鉴于有的人不会调试脚本,我打算打包一个app。打包脚本遇到的问题 打包后安装,提示包解析错误 然后我就准备用autojs8。8。20打包, 先运行一次脚本,脚本报错了Javaclassandroidx。core。view。ViewCompathasnopublicinstancefieldormethodnamedgetWindowInsetsController 这个getWindowInsetsController方法是安卓11新增的全屏api, autojs8。8。20出来的时候,还没有支持安卓11, 因此我把这个全屏函数trycatch了 再次运行脚本,还是报错Error:Moduledatadataorg。autojs。autojsprocacheremoteproject3a26c38d0089d40061afbd09dacd38b5config。jsonnotfound。 我在autojs9。0。14用的好好的,在autojs8。8。20就报错了,也是有点委屈; 报错说找不到模块文件,那么我们去对应的目录下面看看都有什么文件 shell打印文件目录cmdcddatauser0org。autojs。autojsprocacheremoteprojectcb63fce5e400e29f9d8b3bacbab39fa5varresultshell(cmd);log(result);console。show();if(result。code0){toast(执行成功);}else{toast(执行失败!请到控制台查看错误信息);} 打印出来的内容 明明有这个config。js文件的 我知道哪里的问题了 调试的时候用了上一次的args没注释args{fromPath:datadataorg。autojs。autojsprocacheremoteproject3a26c38d0089d40061afbd09dacd38b5,imgPath:storageemulated0脚本opencvToolboximg。png,toolName:hsv通道分离,}; 可气 注释后运行就正常了 再打包试试,还是提示解析错误 然后就开始猜测是哪里错了 打包的时候有一些东西要填写,我把中文和破折号等都给删掉, 再次打包,居然可以了,看来是中文或者破折号的问题 测试环境 手机:Mi11Pro Android版本:12 Autojs版本:9。1。14 名人名言 思路是最重要的,其他的百度,bing,stackoverflow,github,安卓文档,autojs文档,最后才是群里问问牙叔教程 声明 部分内容来自网络本教程仅用于学习,禁止用于其他用途