最近做图片处理时,看别人代码使用了 opencv 的阈值函数 threshold,网上搜索了下这个函数的使用说明。
简单地讲,所谓阈值就是说如果待处理的数据达到了某个临界点后,如何处理的方式。
python里定义如下:cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst
参数说明如下: src:源图片 thresh:阈值,取值范围0~255 maxval:填充值,取值范围0~255 type:阈值类型,表示的是这里划分的时候使用的是什么类型的算法,常用值为0(cv2.THRESH_BINARY)
图中(x,y)表示的是图像中的坐标 INV 表示的是取反 一般的(BINARY)效果是: 将一个灰色的图片,变成要么是白色要么就是黑色。(大于规定thresh值就是设置的最大值(常为255,也就是白色))
下面是几个方式的效果图
THRESH_BINARY
THRESH_BINARY_INV
THRESH_TRUNC
THRESH_TOZERO
THRESH_TOZERO_INV
实际操作上来说,建议传入已经灰度处理后的图像。
这几天在尝试在ARM上安装python3,是各种麻烦的很。突然发现apt-get install后各种报错,郁闷之极。
现在回头再检查,应该就是当初运行了 apt-get -f install 命令导致的。
因为是安装各种软件都有这个问题,所以影响很大,内心恨不得要把系统给重装了才对。在网上各种检索都不对,后来无意间终于发现了一个方法 。
亲测有效。但是不知道原因。
cd /var/lib/dpkg
sudo mv info info.bak
sudo mkdir info
就这么简单的几行代码,解决了问题。
现在要做的就是回想当初遗漏了哪些命令。
最近的一个实验项目,要监控UWP程序的启动。发现了一个比较简单的方式是使用 WMI,当有新的进程被创建时,就可以收到一个消息回调,这样的方式比不断地去轮询要优雅和有效率的多。
但是我们的目标UWP,是采用 WinJS开发的,这样会带来一个问题。就是在进程列表里,它是托管在一个叫做 wwahost.exe 的进程里的。如果有多个类似的程序的话,我们无法简单地区分出来。
所以我们需要进一步获取详细信息以便做过滤,幸好微软提供了配套的东西。我们可以使用一个叫做 UserModelId的东西来对不同的UWP程序做区分。下面是来自微软官方的实例代码(https://docs.microsoft.com/zh-cn/windows/win32/api/appmodel/nf-appmodel-getapplicationusermodelid)。
#define _UNICODE 1
#define UNICODE 1
#include <Windows.h>
#include <appmodel.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>
int ShowUsage();
void ShowProcessApplicationUserModelId(__in const UINT32 pid, __in HANDLE process);
int ShowUsage()
{
wprintf(L"Usage: GetApplicationUserModelId <pid> [<pid>...]\n");
return 1;
}
int __cdecl wmain(__in int argc, __in_ecount(argc) WCHAR * argv[])
{
if (argc <= 1)
return ShowUsage();
for (int i=1; i<argc; ++i)
{
UINT32 pid = wcstoul(argv[i], NULL, 10);
if (pid > 0)
{
HANDLE process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
if (process == NULL)
wprintf(L"Error %d in OpenProcess (pid=%u)\n", GetLastError(), pid);
else
{
ShowProcessApplicationUserModelId(pid, process);
CloseHandle(process);
}
}
}
return 0;
}
void ShowProcessApplicationUserModelId(__in const UINT32 pid, __in HANDLE process)
{
wprintf(L"Process %u (handle=%p)\n", pid, process);
UINT32 length = 0;
LONG rc = GetApplicationUserModelId(process, &length, NULL);
if (rc != ERROR_INSUFFICIENT_BUFFER)
{
if (rc == APPMODEL_ERROR_NO_APPLICATION)
wprintf(L"Desktop application\n");
else
wprintf(L"Error %d in GetApplicationUserModelId\n", rc);
return;
}
PWSTR fullName = (PWSTR) malloc(length * sizeof(*fullName));
if (fullName == NULL)
{
wprintf(L"Error allocating memory\n");
return;
}
rc = GetApplicationUserModelId(process, &length, fullName);
if (rc != ERROR_SUCCESS)
wprintf(L"Error %d retrieving ApplicationUserModelId\n", rc);
else
wprintf(L"%s\n", fullName);
free(fullName);
}
整体的代码比较简单,没有什么特别好说的。代码中一共调用了2次GetApplicationUserModelId方法,第一次是为了计算数据的长度,然后第二次根据数据长度重新请求以得到最终的数据。
这就是我为什么讨厌C++的原因,把指针的操作搞这么恶心。
在代码验证后,又发现了另外一个API:IsImmersiveProcess ,通过该函数可以简单地判断一个进程是否是Store类型的程序,在有的场合例如唯一性校验上还是有帮助的。有兴趣可以移步 https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-isimmersiveprocess
服务器在安装了一次系统更新后,数据盘不见了。跑到后台看磁盘还在,于是进磁盘管理看,可以看到那块磁盘,但是未加载。提示由于管理员设置的策略,该磁盘处于脱机状态。
按照网上的说法,非常忐忑低执行了操作,担心数据一下子没有了。后来成功加载回来了,数据没有丢失。
1.运行:cmd
2.输入:diskpart 回车进入diskpart命令行
3.DISKPART> san
4.DISKPART> san policy=onlineall
5.DISKPART>list disk
6.DISKPART> select disk 1
7.DISKPART>attributes disk clear readonly
8.DISKPART>online disk
节前放假的时候,忘记带电源线,没有想到这个就是噩梦的开始哇。
由于疫情的影响,又是封城,结果一直买不到电源线。直到最近,各个省市逐渐复工,快递才开始工作。
终于收到了电源线。
可以干活了,可以当键盘侠了。
最近的项目使用了 nodejs,有时候在安装 npm 包时,下载速度那个捉急哇。
尝试了搜索下,果然发现了淘宝的镜像源,果断换之。
首先,查看当前的 npm 源地址,输入 npm config list
不出意外的话,可以看到输出里包含这样的结果:metrics-registry = “http://registry.npm.nodejs.org/”
我们改为淘宝的镜像:npm set registry https://registry.npm.taobao.org/
后来再安装 npm 包就很快了,这点还是要谢谢阿里的同学。
如果有一天,各位肉身到了国外,用不上了,就可以使用 rm 命令删除掉: npm config rm registry
祝各位前程似锦。
众所周知,windows 远程桌面默认的端口号是3389,随着现在网络安全环境的恶劣,远程桌面已经很不安全了。修改默认的端口号可以略微的过滤下低级的黑客。
最简单的方式是修改注册表,一共需要修改2个地方地方。
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Terminal Server/WinStations/RDP-Tcp找到下面的 “PortNumber”,用十进制方式显示,默认为3389,改为任意可用端口。
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Terminal Server/Wds/rdpwd/Tds/tcp找到下面的 “PortNumber”,用十进制方式显示,并做出修改。
这2个端口号要是一样的。
最后一步,找开 windows 防火墙高级管理,添加入站规则,允许刚才设定的端口号。这里一定不要忘记了,不然就登不上去了。
重启服务器后就可以使用新的配置登录了。
以前一直没有修改过系统默认的图像,前几天为了测试 IR Camera 不经意间随手换了个图像,结果发现图像无法删除。
于是就想找到存放的地方去删除,经过一番搜索,发现路径在 C:\Users[User Name]\AppData\Roaming\Microsoft\Windows\AccountPictures,需要留意的是,对于中文系统,AccountPictures 文件夹名字叫做“用户图像”。
进入该文件夹后,就可以看到所有的历史图像了,根据需要删除文件即可。
最近写了一个console的小工具,但是发给对方,在界面上中文显示乱码。原因也很简单,就是因为对方使用的是英文系统,其语言代码页用的是英语。可以通过下面的方法来解决。
打开控制面板,切换图标按照类型显示,选择“时钟、语言和区域”链接,再选择“区域”,切换到最后一个“管理”选项卡。
在对话框的底部,有一个“更改系统区域设置…”的按钮,点击后会弹出一个新的对话框,在里面选择“中文(简体,中国)”,然后就一路确认,最后按照提示重启系统。
系统重启完成后,再运行程序,就可以正常显示中文了。
最近在做一个 demo,需要去监听用户是否有锁屏,或者注销操作。用 C++ 可以去接收特定的消息去处理,但我总觉得 C# 应该有更好的实现。
搜索了一番,果然找到了,还是微软好呀,啥都为我们考虑到了,搞了一点动力都没有。
为了实现这样的效果,需要使用 Microsoft.Win32.SystemEvents 类,他提供了一些事件,我们可以注册这些事件来完成自己的需求。
Microsoft.Win32.SystemEvents.SessionSwitch += new Microsoft.Win32.SessionSwitchEventHandler(SystemEvents_SessionSwitch);
void SystemEvents_SessionSwitch(object sender, Microsoft.Win32.SessionSwitchEventArgs e)
{
if (e.Reason == Microsoft.Win32.SessionSwitchReason.SessionLock)
{
// 屏幕锁定
}
else if (e.Reason == Microsoft.Win32.SessionSwitchReason.SessionUnlock)
{
// 屏幕解锁
}
}
是不是很简单?都不需要实例化类。但是需要注意的是,因为是静态类,所以在必要的时候,需要显示地去取消事件注册,以避免内存泄露。