- 博客(123)
- 资源 (6)
- 收藏
- 关注
原创 windows下readdir()函数如果使用中文文件名有问题
在处理包含中文文件名的目录时,使用opendir和readdir函数可能会导致entry->d_name输出问号,无法正确显示中文字符。为了解决这一问题,可以改用_findfirst、_findnext和_findclose这组函数,它们能够正确处理包含中文的文件名,确保输出结果准确无误。
2025-05-12 14:26:53
94
原创 机器视觉:网球练习自动记分的实现
我设计的算法可用安卓手机实现,手机本身是算力强大的智能计算机,有Wi-Fi,不需要布置网线,而且还很便宜。郑钦文奥运夺冠带来了一股网球热潮,但网球的场地问题很难解决,最近流行一种玩法是在室内放置发球机,发球机上方布置一块幕布,幕布印上数个得分区,练习者击打网球,根据球击中幕布的位置计算得分。实际上幕布被击中后会变形,球会滞空一段时间,30fps的帧率完全足够了,可以非常精准地捕获到击球点。可以看到,我实现的算法比较健壮,甚至练习者出现在画面内,也能排除干扰,准确识别并计分。
2025-01-20 15:10:23
247
原创 Android JNI项目build时报告missing and no known rule to make it的原因
原因是 “cmake不喜欢相对路径”
2024-09-08 15:30:34
982
原创 websocketpp在visual studio c++下的编译
websocketpp即websocket++,号称只要包含几个头文件,就可以用C++构建websocket server,我的编译器是visual studiao 2017。折腾半天,编译都通不过,经过摸索,发现需要做几个关键设置。本文说明编译项目的成功过程。
2024-07-26 14:16:36
702
原创 实现手机扫码——扫描识别路由器参数
有个应用是批量自动检测无线路由器,检测前需要自动登录路由器的管理界面进行设置,如设置wifi参数、连接模式,或者恢复出厂设置等。PaddleOCR 识别的结果是一些分离的数据,数据很多,需要进行整合处理,提取出MAC地址和管理密码。有两个按钮,“识别”按下时才进行识别,可以分别对准不同区域,多次识别。实际上路由器的背板上贴了个标签,上面印上了本设备的所有参数,要是能像平时扫二维码一样用手机照一下就能取出,那就方便了。普通的OCR需要先拍照再识别,我做的这个扫码APP则更为方便,就像扫二维码一样。
2023-12-09 10:54:06
442
原创 二进制安装gdb和valgrind
客户的服务器是redhat 9.2,放在一个没办法上网的局域网内,没有gcc,没有make,几乎没办法源代码的方式编译安装任何工具。应用程序在我笔记本上的centos 7编译调试好后,scp到目标服务器上跑,遇到段错误崩溃,很难调试,迫切需要在这台服务器上安装gdb或者valgrind。
2023-10-17 11:59:46
288
原创 基于XDP技术的高性能rtp媒体转发服务程序
使用Linux XDP(dBpf)技术实现的rtp转发服务器,比普通转发服务器性能提升30倍以上。本文讲了一些实现上的要点。
2023-06-21 15:03:45
1241
原创 因磁盘空间不足导致MacBook Pro无法启动(反复重启)的解决过程
我的电脑是2017版的15寸MacBook Pro,SSD空间512G,因为装了windows和Linux虚拟机,再加上微信、QQ都是吃磁盘大户,剩余空间仅剩11G左右。我的时间机器备份是一个半月以前的,如果据此恢复,则我最近写的代码和文档都要丢失,太痛苦了,无论如何要折腾一下。6、选择右上角的wifi,有网络后在恢复模式安装最新的MacOS,大概1、2小时,喝杯咖啡回来,系统也回来了。解决之道是用命令行释放磁盘空间,然后重新安装操作系统,除了你自己主动删除的,并不会丢失其它数据。
2023-03-23 10:34:37
4102
1
原创 机器学习:钻石鉴定
准确区分天然钻石和培育钻石,在珠宝行业成了迫切的需求。最近为客户做了个机器学习算法来区分钻石的光谱。钻石判定本质上是个分类问题,可以有多个分类,如天然钻、尼莫石、培育之CVD、培育之HPHT(高温高压)等。分类问题很适合用机器学习的方法解决。我训练出来的模型,效果很不错,准确率很高,而且很具通用性。
2022-12-27 17:53:23
372
原创 串口隔离内外网的通信协议设计
市面上有很多USB转RS232串口的转接线,可以买一跟公头、一根母头,分别插在两台电脑的USB或Type-C口上,系统通常会自动安装驱动,映射为一个COM口。但实际的应用又需要访问内网的某些服务,怎么办呢?最后一点意味着,串口通可能偶尔不可靠,不能把它当成类似TCP那样的可靠连接,但也不能把它当成UDP那样的独立数据包进行处理。tcp连接句柄号,即socket的整数转换为数字字符串,后续数据都是这个连接的数据,直到新的协议头。2、服务端收到后,创建和目标地址的连接,程序将此连接和对端连接11进行关联;
2022-09-30 10:54:08
2060
原创 安卓手机检测水表的帧率问题
虽然可以,也不是那么容易。第一个是需要找到合适的手机,从成本的角度,如果大量部署不能太贵,所幸检测用的手机并不需要很多高级功能,比如不需要5G——甚至4G也不需要,只需要自带的WiFi在局域网内和控制机通信即可。通常手机相机的帧率是30fps,根据香农采样定律,帧率实际上决定了对旋转仪表的分辨率,如果水表的流速较快,30帧率是不足以分辨的,会带来误差。我们基于安卓手机做的水表检测有多种模式,在固定的时间内进行检测,一种模式是检测红色指针的旋转角度(圈数),另一种模式是检测黑色梅花轮转过的齿数。...
2022-07-26 11:53:06
515
原创 Android OpenCV竖屏处理策略和底层代码修改
在Android上做机器视觉,不可避免地都会用到OpenCV for Android库,视频流的捕获和预览通常使用 JavaCamera2View 控件,但这个控件在横屏下运作良好,竖屏下问题很多。本文用最小代价解决了这个问题,并给出了关键源代码。...
2022-07-01 10:10:05
708
1
原创 纯属好玩:我做的“截图续弈”
在线下棋有一个常见的苦恼,局势紧张的时候算不清楚,如果能摆一下变化就好了。我做的这个软件就是为了解决这个苦恼,可以将正在进行的对局截图,然后进行试下。
2022-02-22 15:36:12
256
原创 工业机器视觉的趋势--以手机为终端
机器视觉在工业上的应用较为成熟,诸如识别产品缺陷、产品分类和基数、识别机械读数实现的自动仪表,等等,很多行业都有。一般采用专用设备,如工业相机、嵌入式终端,然后通过总线和上位机通信,终端上还要考虑设置按钮,相当麻烦。这样做的优点是可以卖专用设备,研发的厂商更容易宣传,反正像个黑盒子,里面是啥厂商说了算。缺点太多了,嵌入式设备cpu算力很低,软件更新困难,维修不便,成本很高。研发和生产周期长。最近做了一个用安卓手机作为检测终端的项目(水表圈数检测),十分成功:1、性价比高,有效降低了成本,手机
2021-11-03 09:44:10
1927
2
原创 精确射箭识别:环数和坐标
需求背景:射箭馆射出一支箭,如果人工报靶,危险、繁琐而且人力成本高。人一直盯着靶子,会眼睛疲劳,靶面上出现十多支密集的箭时,眼花缭乱也弄不清那支是新射入的了。因此,考虑完全使用摄像头程序方式完成,摄像头对准靶面,当有箭射入时,准确判断第几环。靶面图片:射入一支箭:射入多支箭:解决之道:使用OpenCV。首先将图像二值化,搜索出一个个环的边界,并转换成极坐标:上面准确地定位环,为了便于调试和观察将之用彩色点进行了标识。射箭的识别,需要对前后两张图像相减然
2021-07-03 20:31:18
6043
13
原创 高精度定时器在windows10下失效及其解决方法
很多地方要用到高精度定时器,比如实时通信、多媒体处理、游戏开发等。我开发的软交换系统中,多媒体处理要用到高精度的定时器,在windows下常见的做法是:先设置定时器精度为1毫秒:timeBeginPeriod(1);这步很关键,否则定时器的精度很低,大概只有15.6毫秒,基本不能用。然后使用这样一组函数:CreateTimerQueue();CreateTimerQueueTimer(&t, timer,(WAITORTIMERCALLBACK)OneMilliSeco.
2021-04-02 18:03:08
5501
原创 文字游戏--程序员的天对地雨对风大陆对长空
计算机相关的术语富有时代气息,我凑了一些对仗或近似对仗的词汇,挺好玩的,欢迎大家补充。程序员用这些素材写成春联,无不称酷。日常用语红外,蓝牙;千年虫,阿法狗;电脑黑客,网络爬虫;自动驾驶,人脸识别,神经网络,深度学习。debug吐核,蓝屏,网页404,加班996。程序崩溃,抛出异常;栈溢出,堆破坏,死循环,空指针,单步调试,日志跟踪。AI决策树,向量机,随机森林,动态规划,快速傅里叶,朴素贝叶斯。编程SQL,触发器,查询优化,.
2021-03-22 14:46:18
251
3
原创 从曲线图片恢复数据
很多应用是将传感器采集的数据绘制成曲线,如随时间变化的电流、电压或者功率。目前有个应用反过来,有数百张存放在pdf文档上的曲线截图,这些历史图片缺失了原始数据,需要根据分辨率很低的图片将数据恢复过来。这类应用通常是AI大数据分析的前端,恢复效果直接影响数据的质量。原始图片:以上图为例,是一幅功率图,由2条不同颜色的曲线组成,红色表示实际值和青色表示平均值。横坐标是时间轴,0-7.25秒,纵坐标表示功率,最大功率1800瓦。恢复数据的难点:1、两种颜色的曲线有叠加的地方,分离不容易;2、背景
2020-12-20 12:16:27
1747
3
原创 Linux下gettimeofday()的问题
windows下有GetTickCount()和GetTickCount64()函数,返回的是毫秒tick,通常用来计算两个时间差。我在Linux下封装了一个同名的函数:unsigned long long GetTickCount64(){ timeval ts; gettimeofday(&ts,0); return(ts.tv_sec * 1000 + ts.tv_usec / 1000);}使用起来很简单:uint64_t t1 = GetTickCount6
2020-08-10 10:13:15
1313
原创 画面中定位汉字串的外轮廓
我们做的项目需要匹配两张图片,比如机顶盒输出的视频,设置的菜单画面有很多汉字,并不需要认出这些汉字,通过标注汉字串的轮廓,对比两张图片的轮廓位置和大小,就可以判断画面相似度,进而判断当前处于哪个菜单。那么,如何定位这些汉字串的轮廓呢?请看原图:最容易想到的方法是先使用opencv的findContours()函数找出所有的轮廓,然后再对每个轮廓去找矩形----使用的是boundingRect()函数。但这样找出来的矩形并不能完全覆盖汉字字符串的外部,只能在比较方正的汉字中定位到少数几个矩形框
2020-06-01 20:17:15
362
原创 大规模sip信令存储、查询和实时跟踪的实现
15年前运营商的核心网还是七号信令(SS7),那时候的信令采集、监控和检测系统还很落后,基本上就是给交换部门一个实时跟踪呼叫的工具,如果需要查询历史信令,很麻烦,需要倒库,查询速度超慢。当时一个朋友想挖掘呼叫的数据,于是我在本地网已经收敛好的信令上,做了一个信令采集、存储和快速检索系统,性能远超当时的中创信测系统,颇得运营商搞交换的弟兄好评。现在的IMS核心网已经是SIP了,如果重新设计一个类似的系统,可能吗?信令采集系统需要采集全部的信令消息,其特点是数据很大,除了呼叫相关的信令消息还有注册消息,堪称
2020-05-10 15:23:01
1375
原创 如何实现单机大规模并发SIP语音呼叫?
锁定目标:单机5千多大叫大,1千还是1万?好吧,暂定为5000或以上。带宽不够?千兆网。硬盘太慢?SSD。本文不考虑IO的限制,只讨论结构和模式。开源世界Voip领域最响亮的牌子应该是FreeSwitch,使用者众多,它能实现如此大规模的单机并发吗?我认为:不行。为什么不行?因为它线程太多,一个通道一个线程,上5000个线程,玩不转:“CPU忙着切换线程上下文了,哪有时间干正事”(...
2020-03-11 16:55:13
1295
原创 程序员如何辅导儿子做数学?
靠山吃山,当然是借助编程了。我家的孩子上小学三年级,比较喜欢数学,课外在深圳上学而思的创新预备班。去年寒假开始我教他学习C语言编程,每天1个小时左右,说是教,其实大部分时间是他自己看大部头的《C Primer Plus》,也算是半自学。每天在我给他的旧13寸MacBook Pro上用VS Code敲入书上的代码,或者自己改写,然后在Mac的终端下gcc编译,测试,倒也自得其乐。也许有人会问...
2020-02-20 14:48:26
585
原创 GSM音频编码的优化和写入wav文件
GSM是voip中较为常见的一种编码,压缩率比很高,写到wav文件每秒只占用1.6k字节(接近于g729),是普通g711格式的五分之一,对录音来说可节省大量磁盘空间。生成的wav文件,可能是不牵涉到专利的原因,在各种操作系统下都能够播放。1、使用IPP的codecGSM的编解码通常使用开源C代码,入口文件是gsm_encode.c和gsm_decode.c,能用,但不够优化。我使用I...
2019-12-24 14:33:10
1882
原创 录音程序移植到Linux心得
我曾经写过一篇文章“如何实现一个voip录音系统”,后来还描述了持续改进的思路,但该程序只支持64位windows环境,现在很多主流的软交换--如常见的Asterisk、vos等--都运行在linux下,移植到Linux很有必要,很多情况下可以不用交换机镜像就进行录音。程序是使用C/C++开发的,语言层面的移植是相对容易的,毕竟C/C++是通用编程语言,而且C++11以后的多线程库等在多个平台...
2019-11-25 11:22:44
319
原创 使用ipp静态库,ipp-samples在linux下的make过程
折腾了两天终于搞定,现在把折腾的过程记录一下。1、先安装ipp8,运行install.sh进行安装,安装过程选择评估版,因为我们也只是需要它的库,使用并不影响。2、安装cpp_studio_xe_2013_sp1_update2,和1一样,运行install.sh,比较简单。----我现在怀疑第1步可以省略,因为intel的cpp studio xe里面实际上包含了ipp的头文件和库,...
2019-11-21 15:46:40
1318
原创 移植C/C++到嵌入式Linux下程序崩溃的问题
最近将自己开发的SIP协议栈移植到ARM芯片下的嵌入式Linux,遇到一个奇怪问题,这篇小文简要记录解决过程。相同的代码在windows下、CentOS Linux下都正常,交叉编译到ARM芯片的64位Linux下总是崩溃,估计堆栈、内存被破坏,用Valgrind没办法定位到具体的出错位置。经过多次用最原始的printf()跟踪,发现和md5加密函数有关,筛查了代码死活也没发现错误。如此折腾了...
2019-08-06 16:28:33
632
原创 感觉好极了----MacBookPro15苹果笔记本外接4K显示器
作为一个中年程序员,视力越来越差,于是不惜血本加了一个4K屏,效果很是不错。我的本本是带Touch Bar的15寸MacBook Pro,Type-C,带4个接口:装了个虚拟机Parallels Desktop 13for Mac,装了win10和CentOS 7,编程大部分时间使用windows下的VC++2017,当然写代码经常用微软的Code for Mac。主要就是win...
2019-06-14 16:42:04
31337
9
原创 无锁:高性能录音系统根本性改进
当并发呼叫增加到1千以上(交换机端口镜像过来的流量达150M),含多种语音编码时(如g711A、U和g729等),录音系统性能出现下降,如丢录音,丢包,卡顿甚至崩溃等情况。经过彻底改进和优化,录音系统运行非常顺畅,可以长时间稳定运行而不会丢失任何数据。下面记录一下改进的关键部分。1、抓包改进抓包库使用的pcap_开头的函数,有很多可优化的地方,如设置缓冲区大小,读包延时(最好就不要...
2018-09-19 11:33:22
518
原创 改进后的电话语音机器人
拙文“更聪明的电话语音机器人”解决了电话语音机器人的两个痛点,即模糊识别和关键词配置,但从实际的效果看,关键词(词槽)配置还是简单了一些,实际应用需要将词槽串接起来。经过改进后的例子如下:cfg = """ { "init":{"voc/welcome1.wav","voc/welcome2.wav",}, "keys":{ {{"额度","
2018-08-06 16:12:26
399
原创 编程两得
1、dll导出函数,不可用stdcall:最近写了个Dll,同时编译了64位和32位版本,64位一切正常,32位版本有问题。调用程序使用动态加载方法,GetProcAddress()定位函数地址总是返回NULL。后来发现导出函数名不应该使用_stdcall描述。错误:extern "C" __declspec(dllexport) int _stdcall ServerFun1(...);...
2018-07-22 17:34:18
311
原创 更聪明的电话语音机器人
有人说AI应用最重要的是工程实现,而不仅仅是算法,诚哉斯言。电话语音机器人目前应用最多的是电话营销,我接过几个这样的电话,挺傻的,基本听不懂人话。我也见过一些所谓的电话机器人界面,配置十分复杂,每个关键字要配置一个节点,存储到数据库,运行的时候关键字匹配,需要在数据库里做上百个sql查询,查来查去,效率极低不说,灵活性反而大受限制。我实现的电话语音机器人,就是解决上述两个根本性问题,而且接口十分简...
2018-07-14 12:37:22
849
原创 SIP服务器提供REST格式的API并新增分段录音
底层的API要用较为复杂的状态机,开发起来有一定难度。REST即Http+Json方式,相对容易集成。新增分段录音,即在录音时进行VAD(活动语音检测),检测到开始说话,上报一个消息,说话中检测到足够长的停顿,再上报一个消息,并另起一个新录音文件。分段录音应用于智能交互(AI),侦听到说话可打断正在进行的放音,侦听到停顿,可开始对该段语音进行识别。简易的REST接口如下(可进一步扩展,如增加桥接、...
2018-04-08 16:54:24
939
原创 徒劳的择校——小学择校的科学分析
为了上个心目中的好小学,家长们空前焦虑,有钱的买学位房孟母三迁,没钱的租房,甚至托关系找中介,学校皆有价,世路难行钱作马,让我们这些程序员家长要熬夜写多少代码。。。可惜,这个钱花冤枉了,本文将证明,上什么小学是一样的。当然,我会加一个重要条件:同一体制下的公立小学。如果不同机制则本文的结论不成立,比如公办-私立,深圳的小学和香港的小学也属于不同机制。下面是简
2017-09-10 11:00:08
462
原创 使用谷歌浏览器内核控件DCEF3拦截弹出的新页面到新标签页
DCEF3控件TChromium有个事件OnBeforePopup,我们可以在这个事件函数里加上自己的逻辑,最后一个参数是返回参数bool &Result,置为true表示自己来处理,置为false表示使用默认行为,即弹出一个新的窗口。对于构造多标签页浏览器,我们的应用逻辑是在事件处理函数中取得url参数,重新new一个TChromium放置在新标签页,但这样做有问题,总是卡住然后崩溃
2017-05-20 15:03:53
3182
原创 IP录音增加对H248即MEGACO协议的支持
传统的媒体网关设备的控制协议是基于H248即MEGACO协议,这个协议和SIP协议不一样。而且,H248的底层传输协议一般采用SCTP协议。这给IP录音软件开发带来了挑战。实现思路:1、最大限度兼容原有录音系统结构,使用原有的SIP机制;MEGACO消息中的Context值相当于SIP消息中的Call-ID头域。2、抓包过滤除udp,tcp外增加sctp,并剔除掉16个字节
2017-04-18 12:14:08
1235
原创 关于Linux下的高精度定时器
操作系统的默认定时器的精度是很低的,比如在windows下调用Sleep(20)延时20毫秒,实际上80毫秒都可能。做媒体服务器,免不了需要高精度的定时器,比如语音会议,需要很精确地每20毫秒进行一次混音并通过rtp发送。我们的媒体库原来只在windows下实现,使用了windows写的高性能定时器的一组函数:CreateTimerQueue()CreateTi
2017-03-20 10:16:01
3084
原创 在C++Builder6中使用DCEF3嵌入谷歌内核浏览器
历史原因,我有个客户端程序是使用BCB6写的,里面使用了CppWebBrowser控件,众所周知,这个控件使用的是IE内核,对HTML5的兼容性太差,面临很多问题,有些问题甚至即使改注册表将内核版本强制使用为IE11也解决不了。于是寻找Chrome内核的嵌入使用。一开始走了不少弯路,想直接使用CEF的C++接口,发现很困难。再后来发现有人将这个框架封装成了Delphi控件,于是拿来一用,当然这
2016-12-19 18:28:09
4463
3
将扫描好的单个pdf文件拆成一个个jpg
2023-01-10
围棋对弈时截图后进行对局研究的软件--截图续弈2
2022-02-22
超级简单的xyCloud代理软件,可代理ssh、远程桌面等tcp端口
2020-09-22
截图续弈(打谱)软件
2014-02-08
可嵌入UltraEdit的计算器程序
2008-11-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人