存档

2020年7月 的存档

图像形态学处理cv2.dilate膨胀函数

2020年7月29日 没有评论

在前面接触到阈值处理函数后,又继续了解到 opencv 的腐蚀函数和膨胀函数。腐蚀函数可以用来处理图片里不重要的噪音或者纹理。而膨胀函数如字面意义,处理后图像看起来像气球涨起来了一样,可以借此兼容图片里的孔洞或者边缘的缺陷。

膨胀函数定义如下:
cv2.dilate(src, kernel, iteration)

参数说明:
src表示输入的图片,
kernel表示方框的大小,
iteration表示迭代的次数,迭代次数越多,膨胀幅度越大

膨胀操作原理:存在一个kernel,在图像上进行从左到右,从上到下的平移,如果方框中存在白色,那么这个方框内所有的颜色都是白色。有此可见,这个kernel 的尺寸选择,就比较重要了。

下面是效果示意图:

左上角部分是添加了噪音部分,左下角是对其进行腐蚀后的图,可以看到,基本上可以得到我们所需要的内容了。右下角是针对腐蚀后的图进行膨胀,这2个函数都是只进行1次迭代。结果可以看到和原图差不多了。

分类: Python 标签:

Yolo探索之 OpenCV 安装

2020年7月6日 没有评论

其实 opencv 对于 windows 平台是很友好的,先从这里下载最新版本的opencv的包,看起来是个exe,其实就是一个自解压缩包,解压缩完成后,界面就会自动消失,所以大家不要慌。

我这里就给放到了 c:\tools 目录下。

再接下来就是要添加环境变量了,在 opencv\build 目录下,有一个setup_vars_opencv4.cmd 文件,在命令行下以管理员权限执行它,就会增加一部分环境变量。

然后【我的电脑(右键)】->【属性】->【高级系统设置】->【高级(标签)】->【环境变量】->“双击”系统变量中的Path->在变量值里面添加相应的路径。

由于目录下有 vc14 和 vc15 两个目录,所以建议把这两个都给加进去,例如 C:\Tools\opencv\build\x64\vc15\bin。

还有最后一步,就是重启系统以便生效。我没有重启系统,后面编译 yolo 的时候就报错了。所以为了稳妥起见,重启下还是比较好。

分类: AI, 一句话 标签: ,

获取chrome当前标签页的地址

2020年7月3日 没有评论

在评估一个demo的时候,有一个需求是要获得用户当前浏览器正在访问的网页是否命中我们的白名单,如果是的话,则会开启一系列的优化模式设定。

经过一番搜索,发现可以使用微软的自动化测试框架来间接满足我们的要求。

MS UI Automation是MSAA技术的一个替代品:即让控件和应用程序具有更好的可达性(accessible)。简单来讲,它就是几个dll,提供了一套API和Interface,及其相应的模式,让软件的开发者遵循该模式去实现相应的interface,从而软件的使用者(不仅仅是客户,还包括例如测试人员想编写一些自动化测试代码来完成程序相关的业务逻辑)能更好的使用该软件。

在UI Automation中,所有的窗体、控件都表现为一个AutomationElement, AutomationElement 中包含此控件或窗体的属性,在实现自动化的过程中,我们通过其相关属性进行对控件自动化操作。对于UI用户界面来说,所有显示在桌面上的UI,其实际是一个UI Tree,根节点是desktop。我们可以使用UI Spy或者是SPY++来获得Window和Control的相关信息。在UI Automation里,根节点表示为AutomationElemnet.RootElement. 通过根节点,我们可以通过窗体或控件的Process Id、Process Name或者Window Name找到相应的子AutomationElement,例如 Dialog、Button、 TextBox、Checkbox等标准控件,通过控件所对应的Pattern进行相关的操作。

Process[] procsChrome = Process.GetProcessesByName("chrome");

if (procsChrome.Length <= 0)
{
    Console.WriteLine("未找到 chrome 进程");
}

foreach (Process proc in procsChrome)
{
    // the chrome process must have a window 
    if (proc.MainWindowHandle == IntPtr.Zero)
    {
        continue;
    }

    AutomationElement root = AutomationElement.FromHandle(proc.MainWindowHandle);
    Condition conditions = new AndCondition(
        new PropertyCondition(AutomationElement.ProcessIdProperty, proc.Id),
        new PropertyCondition(AutomationElement.IsControlElementProperty, true),
        new PropertyCondition(AutomationElement.IsContentElementProperty, true),
        new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit)
    );

    AutomationElement bar = root.FindFirst(TreeScope.Descendants, conditions);

    if(bar != null)
    {
        var url = bar.GetCurrentPropertyValue(ValuePatternIdentifiers.ValueProperty).ToString();
        Console.WriteLine(url);
    }
}

不过,根据网上的说法,这样的代码只在v53以上版本才有效果。目前浏览器版本都7、80了,对于一个demo而言,应该可以满足大部分要求了。

分类: 日常 标签: